Я пытаюсь преобразовать файлы .csv (выходные данные проекта OpenFace) в файлы .pts, и я хотел бы извлечь некоторые столбцы из первой строки (файл .csv) и записать их в файл .pts

Это код, который я выполняю:

import csv
import os
from collections import defaultdict


columns = defaultdict(list) # each value in each column is appended to a list
directory = "D:\\dtsface\\"

#for filename in os.listdir(directory):
 #   if filename.endswith(".csv"):
with open("image_0001.csv","r",newline='') as f:
    file= open("image_0001.pts","w")
    reader = csv.reader(f)
    row1= next(reader)
    row2= next(reader)
    print(row2)
file.write("n_points: ")
file.writelines("{")
i=0
j=28
while(i<=7):
    file.writelines('\n\neye_lmk_x_'+str(i)+"\n\n"+str(columns[' eye_lmk_x_'+str(i)]))
    i=i+1           
while(j<=35):
    file.writelines('\n\neye_lmk_x_'+str(j)+"\n\n"+str(columns[' eye_lmk_x_'+str(j)]))
    j=j+1
'''
for filename in os.listdir(directory):
    if filename.endswith(".csv"):
        filename2= os.path.basename(f.name)
        file= f.rsplit('.',1)[0]
        with open(filename2+".pts",'w'):
            while(i<=7):
                file.writelines('\n\neye_lmk_x_'+str(i)+"\n\n"+str(columns[' eye_lmk_x_'+str(j)]))
                i=i+1
            while(j<=35):
                file.writelines('\n\neye_lmk_x_'+str(j)+"\n\n"+str(columns[' eye_lmk_x_'+str(j)]))
                j=j+1
file.close()

'''

Пример файла .csv, который у меня есть:

.csv file

Пример файла .pts, который я хочу сгенерировать:

.pts file

Как я могу это сделать?

-1
abdou93 30 Май 2019 в 14:10

2 ответа

Лучший ответ

Согласно комментарию к вопросу:

@ Напоследок мой вопрос: как мне извлечь некоторые столбцы из первой строки файла csf?

Если у вас есть этот код

with open("image_0001.csv","r",newline='') as f:
    reader = csv.reader(f)
    row1= next(reader)
    row2= next(reader)
    print(row2)

Тогда row2 должен быть списком, в котором каждый элемент содержит содержимое одной ячейки данных (тип данных будет str) строки секунд, row1 будет содержать данные из первый ряд и т. д.

Чтобы получить первую ячейку второго ряда, вы просто получаете доступ к первому элементу:

# first cell of first row
print(row1[0])
# first cell of second row
print(row2[0])
# third cell of second row
print(row2[2])

Это отвечает на ваш вопрос?

0
Ralf 30 Май 2019 в 11:59

Я изменил свой код, я нашел плохое решение, которое вы пишете, но оно не решает некоторые проблемы, я сказал, что плохое решение, потому что каждый раз, когда я должен найти номер столбца для записи в коде, так что это не очень хорошо решение, для этого я хочу получить ячейку по имени столбца, например:

row2=next(reader)
print(row2['eye_lmk_x_0']) # I know that this doesn't exist but i search a something like this

Вместо

 row2= next(reader)
    print(row2[1])

Это мой код после обновления:

import csv
import os
from collections import defaultdict


columns = defaultdict(list) # each value in each column is appended to a list
directory = "D:\\dtsface\\"

#for filename in os.listdir(directory):
 #   if filename.endswith(".csv"):
with open("image_0001.csv","r",newline='') as f:
    file= open("image_0001.pts","w")
    reader = csv.reader(f)
    row1= next(reader)
    row2= next(reader)
    print(row2[1])
    print(row2[2])
file.write("n_points: ")
file.writelines("{")
i=11
j=39
while(i<=18):
    #file.writelines('\n\neye_lmk_x_'+str(i)+"\n\n"+str(columns[' eye_lmk_x_'+str(i)]))
    file.writelines('\n'+str(row2[i]))
    i=i+1           
while(j<=46):
    #file.writelines('\n\n'+str(j)+"\n\n"+str(columns[' eye_lmk_x_'+str(j)]))
    file.writelines('\n'+str(row2[j]))

    j=j+1
'''
for filename in os.listdir(directory):
    if filename.endswith(".csv"):
        filename2= os.path.basename(f.name)
        file= f.rsplit('.',1)[0]
        with open(filename2+".pts",'w'):
            while(i<=7):
                file.writelines('\n\neye_lmk_x_'+str(i)+"\n\n"+str(columns[' eye_lmk_x_'+str(j)]))
                i=i+1
            while(j<=35):
                file.writelines('\n\neye_lmk_x_'+str(j)+"\n\n"+str(columns[' eye_lmk_x_'+str(j)]))
                j=j+1
file.close()

'''

И мой вывод теперь такой:

выход

Я хочу получить координаты y, поэтому мой вопрос, как я могу получить строки по именам столбцов, а не по количеству столбцов?

0
abdou93 30 Май 2019 в 12:16