Python CSV Writer Объединить два столбца в одной строке - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь записать img_id (одно значение) в первый столбец csv и массив функций изображения (f_descriptor_T) в оставшиеся столбцы файла csv.Я написал следующий код:

path=/home/dir
listing = os.listdir(path)    

for file in listing:
    path_img_ext = os.path.join(path, file) #combine filename and extension
    data_read = feature_io.ReadFromFile(path_img_ext) #read single features of single image in each iteration 

    base=os.path.basename(file) #Extract image_id from its name
    os.path.splitext(file)
    img_id = os.path.splitext(base)[0]

    f_descriptor = data_read[2] #Extract particular array, from multiple arrays of features 

    feature_flat=f_descriptor.flatten() #Make flat array

    f_descriptor_T = np.array(feature_flat).T #Transpose feature array to convert col data to row form. 

    with open("output_0.csv", "a") as f:
        writer = csv.writer(f)
        writer.writerow([img_id])
        writer.writerow(f_descriptor_T)

К сожалению, вывод показывает img_id в одной строке и f_descriptor_T во второй строке с каждой итерацией цикла, как показано на следующем снимке экрана: Вывод

Но я хочу объединить оба (переменную и массив) в одну строку.

Примечание. Я попытался объединить оба из них, но потерпел неудачу.

Требуемый вывод должен быть таким: Желаемый вывод Не обязательно печатать заголовок столбца, но только массив img_id и f_descriptor_T в одной строке.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Попытка воспроизвести ваш CSV-файл

In [131]: arr = np.arange(10) # a flat array
In [132]: arr = np.array(arr).T
In [133]: arr
Out[133]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Я начинаю с плоского файла и все еще имею плоский (.T в массиве 1d ничего не делает)

In [135]: with open('out.csv','a') as f:
     ...:     writer = csv.writer(f)
     ...:     writer.writerow(['id'])
     ...:     writer.writerow(arr.T)
     ...:     
In [136]: cat out.csv
id
0,1,2,3,4,5,6,7,8,9

Каждый вызов writerow записывает строку, как следует из названия.

Но с помощью savetxt я могу легко написать двумерный массив в аккуратных столбцах и строках:

In [137]: np.savetxt('out.csv', arr.reshape(5,2), delimiter=',')
In [138]: cat out.csv
0.000000000000000000e+00,1.000000000000000000e+00
2.000000000000000000e+00,3.000000000000000000e+00
4.000000000000000000e+00,5.000000000000000000e+00
6.000000000000000000e+00,7.000000000000000000e+00
8.000000000000000000e+00,9.000000000000000000e+00
In [139]: np.savetxt('out.csv', arr.reshape(5,2), delimiter=',', fmt='%5d')
In [140]: cat out.csv
    0,    1
    2,    3
    4,    5
    6,    7
    8,    9

Микшированиетекст и числа немного сложнее.

Я могу записать две переменные в одну строку, просто поместив их в список:

In [143]: with open('out.csv','w') as f:
     ...:     writer = csv.writer(f)
     ...:     writer.writerow(['id', arr])
     ...: 
     ...:     
In [144]: cat out.csv
id,[0 1 2 3 4 5 6 7 8 9]

То, что на самом деле сделано:

f.writeline('%s,%s'%(id, arr))

то есть отформатируйте список как строки и напишите.

0 голосов
/ 11 мая 2018

Исходя из вашего текущего кода, f_descriptor_T появляется в другой строке, потому что вы предоставляете f_descriptor_T в другом вызове writerow для остальных данных (каждый вызов writerow создает новую строку).

Обратите внимание, что функция writerow принимает вставляемые данные как один параметр в форме списка.

Если вы хотите, чтобы они были в одном ряду, вам нужно будет указать их в одном вызове. Чтобы сделать это так, как показано на изображении «Желаемый вывод», вам необходимо предоставить автору единый плоский список.

Поскольку у вас есть два разных типа данных (img_id - это строка, а f_descriptor_T содержит числа), я рекомендую сделать это, создав массив, содержащий ваш img_id, а затем добавив содержимое f_descriptor_T к этому. Вам нужно будет преобразовать f_descriptor_T в обычный список Python. Для преобразования вы можете использовать функцию list.

Вот минимальный набор примеров, демонстрирующих поведение.

Вы хотите сделать это, как в примере 4. Он похож на пример 2, но включает в себя пример того, как преобразовать массив numpy в обычный список.

import csv
import numpy as np

#example 1
with open("output_different_rows.csv", "w") as f:
    writer = csv.writer(f)
    writer.writerow(['foo'])
    writer.writerow(['bar'])

#example 2
with open("output_same_row.csv", "w") as f:
    writer = csv.writer(f)
    writer.writerow(['foo'] + ['bar'])
#example 3
with open("output_same_row_with_array.csv", "w") as f:
    writer = csv.writer(f)
    writer.writerow([['foo', 'bar'], 'too'])

#example 4
numpy_array = np.arange(0,9)
listified_array = list(numpy_array)
with open("output_same_row_numpy.csv", "w") as f:
    writer = csv.writer(f)
    writer.writerow(['foo'] + listified_array)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...