Запись таблицы CSV из переменных столбцов? - PullRequest
0 голосов
/ 06 февраля 2020

Я абсолютный новичок в Python, извините, если это тривиально, но я не могу решить эту проблему.

У меня есть 3 списка, содержащие поплавки.

mouse_x = [-0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01, -0.01]
mouse_y = [-0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888, -0.14888888888888888]
mouse_time = [1.5307196849607863, 1.581636800954584, 1.6135933389887214, 1.6362467749859206, 1.6675526530016214, 1.6996790579869412, 1.7314749069628306, 1.7635557259782217, 1.7962380870012566, 1.826124977960717]

То, что я хочу сделать, это объединить эти три переменные так, чтобы они были 3 столбцами моего файла CSV. Это должно выглядеть следующим образом:

mouse_x, mouse_y, mouse_time
-0.01, -0.14888888888888888, 1.5307196849607863
-0.01, -0.14888888888888888, 1.581636800954584
-0.01, -0.14888888888888888, 1.6135933389887214
...
...

Это то, что я пытался:

with open('my_file.csv', 'w', newline='') as f:
    thewriter = csv.writer(f)
    thewriter.writerow(['mouse_x', 'mouse_y', 'mouse_time'])
    counter = 0
    for x in mouse_x_list:
        thewriter.writerows(mouse_x_list[counter], mouse_y_list[counter], mouse_time_list[counter])
        counter +=1

Это приводит к следующей ошибке:

TypeError: writerows () принимает ровно один аргумент (3 дано)

Буду очень признателен за любой совет!

Ответы [ 6 ]

2 голосов
/ 06 февраля 2020

Вам нужно изменить writerows на writerow и заключить три аргумента в список [...]:

thewriter.writerow ( [mouse_x_list[counter], mouse_y_list[counter], mouse_time_list[counter]])

csv.writerows ожидает строку объект, но writerow также принимает простые списки - как вы использовали ранее для записи заголовка.

Не связано, но вы можете опустить counter, используя zip, чтобы сплести эти три списки в один:

for a,b,c in zip(mouse_x_list,mouse_y_list,mouse_time_list):
    thewriter.writerow ( [a,b,c])
1 голос
/ 06 февраля 2020

Это один из способов записи CSV-файла без использования NumPy или Pandas:

with open('my_file.csv', 'w') as f:
    thewriter = csv.writer(f)
    thewriter.writerow(['mouse_x', 'mouse_y', 'mouse_time'])
    len_rows = len(mouse_x)
    for counter in range(len_rows):
        thewriter.writerow([mouse_x[counter], mouse_y[counter], mouse_time[counter]])

Обратите внимание, что вам не нужно увеличивать переменную counter здесь; оператор for в сочетании с range() уже устанавливает counter в 0, 1 и т. д. Обратите внимание, что в for l oop я использую writerow , а не writerows.

Возможно более "Pythoni c" способ написания CSV файл с for l oop должен был бы сделать это:

with open('my_file.csv', 'w') as f:
    thewriter = csv.writer(f)
    thewriter.writerow(['mouse_x', 'mouse_y', 'mouse_time'])
    for mx, my, mtime in zip(mouse_x, mouse_y, mouse_time):
        thewriter.writerow([mx, my, mtime])

Теперь writerows() занимает повторяемых строк, например, список или кортеж из строк. Итеративно, грубо говоря, это то, что вы поместите после «in» в выражении for. Если бы у вас был, скажем, список кортежей, где кортеж i в списке был (mouse_x[i], mouse_y[i], mouse_time[i]), то вы могли бы передать этот список кортежей в writerows() и покончить с этим. В качестве альтернативы можно использовать zip(mouse_x, mouse_y, mouse_time) из вышеприведенного for l oop самого в качестве аргумента writerows():

with open('my_file.csv', 'w') as f:
    thewriter = csv.writer(f)
    thewriter.writerow(['mouse_x', 'mouse_y', 'mouse_time'])
    thewriter.writerows(zip(mouse_x, mouse_y, mouse_time))

Возможно, это еще больше Pythoni c для чего бы это ни стоило.

1 голос
/ 06 февраля 2020

Вы бы согласились использовать numpy? Я считаю, что это очень просто для такого рода приложений:

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

import numpy as np

arr = np.array([mouse_x, mouse_y, mouse_time])

Таким образом, вы можете получить доступ к mouse_x с arr[:, 0], mouse_y с arr[:, 1] и mouse_time с arr[:, 2].

Если у вас есть такая структура данных, numpy предоставляет встроенную функцию для сохранения массивов:

np.savetxt('mouse.csv', arr.T, delimiter=',')
0 голосов
/ 06 февраля 2020

Numpy - одна из лучших библиотек в отношении данных, хранящихся в массивах. Он также включает в себя реализации для сохранения массивов в файл напрямую. Проверьте, как его использовать здесь .

0 голосов
/ 06 февраля 2020

Вы также можете использовать pandas, чтобы сначала создать кадр данных, а затем сохранить его в виде csv-файла:

     import pandas as pd

     df = pd.DataFrame()
     df.insert(0, 'mouse_x', mouse_x)
     df.insert(1, 'mouse_y', mouse_y)
     df.insert(2, 'mouse_time', mouse_time)
     df

output:

        mouse_x mouse_y mouse_time
      0 -0.01   -0.148889   1.530720
      1 -0.01   -0.148889   1.581637
      2 -0.01   -0.148889   1.613593
      3 -0.01   -0.148889   1.636247
      4 -0.01   -0.148889   1.667553
      5 -0.01   -0.148889   1.699679
      6 -0.01   -0.148889   1.731475
      7 -0.01   -0.148889   1.763556
      8 -0.01   -0.148889   1.796238
      9 -0.01   -0.148889   1.826125

сохранить в csv:

     df.to_csv('name_file.csv')
0 голосов
/ 06 февраля 2020

Если вы хотите использовать pandas:

import pandas as pd
df=pd.DataFrame([mouse_x,mouse_y,mouse_time])
df.T.to_csv('my_file.csv', index=False, header=['mouse_x','mouse_y','mouse_time'])
...