Запись списка списков Python в CSV-файл

169

У меня есть длинный список списков следующей формы ---

a = [[1.2,'abc',3],[1.2,'werew',4],........,[1.4,'qew',2]]

т.е. значения в списке имеют разные типы - float, int, strings. Как мне записать его в файл CSV, чтобы мой выходной файл CSV выглядел как

1.2,abc,3
1.2,werew,4
.
.
.
1.4,qew,2

источник
2
Возможный дубликат сохранения результатов в CSV-файл с Python
Martin Thoma

Ответы:

299

Встроенный в Python CSV-модуль может легко справиться с этим:

import csv

with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(a)

Это предполагает, что ваш список определен так же a, как и в вашем вопросе. Вы можете настроить точный формат выходного CSV с помощью различных дополнительных параметров, чтобыcsv.writer() как описано в справочной странице библиотеки, указанной выше.

Обновление для Python 3

import csv

with open("out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a)
янтарный
источник
88
Для совместимости с Python 3 удалите «b» из «wb».
Влад V
28
С Python 3 - открыто ('output.csv', 'w', newline = ''). Я получаю дополнительную строку, если я опускаю параметр новой строки. docs.python.org/3/library/csv.html#csv.writer
Спас
1
В python3 мне пришлось использовать open ('output.csv', 'w', newline = "")
Тим Моттрам
1
ВАУ, что ошибка Python 3 очень бесполезна. Спасибо @vladV (требуется байтоподобный объект, а не 'str'). Это имеет смысл в ретроспективе, но не информативно, где вообще можно посмотреть.
Рамбатино
1
@tlalco, вероятно, означает, что вы используете Python 2, и в этом случае вы должны использовать первый блок кода, а не второй. (Это также означает , что вы должны рассмотреть вопрос о переходе на Python 3.)
Amber
35

Вы можете использовать pandas:

In [1]: import pandas as pd

In [2]: a = [[1.2,'abc',3],[1.2,'werew',4],[1.4,'qew',2]]

In [3]: my_df = pd.DataFrame(a)

In [4]: my_df.to_csv('my_csv.csv', index=False, header=False)
Akavall
источник
Я не думаю, что следует использовать, pandasесли встроенная библиотека csvможет сделать это.
Симин Цзе
6
Мне
9
Конечно, Панды мощные, но я не собираюсь использовать McLaren, чтобы ехать в соседний магазин на углу.
МИ Райт
30
import csv
with open(file_path, 'a') as outcsv:   
    #configure writer to write standard csv file
    writer = csv.writer(outcsv, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
    writer.writerow(['number', 'text', 'number'])
    for item in list:
        #Write item to outcsv
        writer.writerow([item[0], item[1], item[2]])

официальные документы: http://docs.python.org/2/library/csv.html

Дмитрий Загорулькин
источник
1
Это получило бы мой +1, если бы вы могли объяснить свой ответ некоторыми комментариями.
Бурхан Халид
3
writerowне принимает несколько аргументов.
Янтарь
1
>>> w.writerow ("a", "b", "c") Traceback (последний вызов был последним): файл "<stdin>", строка 1, в <module> TypeError: writerow () принимает ровно один аргумент (3 дано)
Янтарь
@Amber, какую версию Python вы используете?
Дмитрий Загорулькин
4
@ Амбер, извини меня. я пропустил []
Дмитрий Загорулькин
11

Если по какой-либо причине вы хотели сделать это вручную (без использования таких модулей, как csv, pandasи numpyт. Д.):

with open('myfile.csv','w') as f:
    for sublist in mylist:
        for item in sublist:
            f.write(item + ',')
        f.write('\n')

Конечно, развертывание вашей собственной версии может быть подвержено ошибкам и неэффективно ... поэтому обычно для этого есть модуль. Но иногда написание собственного может помочь вам понять, как они работают, а иногда это просто проще.

Tegan
источник
11

Использование csv.writer в моем очень большом списке заняло довольно много времени. Я решил использовать панд, это было быстрее и легче контролировать и понимать:

 import pandas

 yourlist = [[...],...,[...]]
 pd = pandas.DataFrame(yourlist)
 pd.to_csv("mylist.csv")

Хорошая часть, которую вы можете изменить, чтобы сделать лучший CSV-файл:

 yourlist = [[...],...,[...]]
 columns = ["abcd","bcde","cdef"] #a csv with 3 columns
 index = [i[0] for i in yourlist] #first element of every list in yourlist
 not_index_list = [i[1:] for i in yourlist]
 pd = pandas.DataFrame(not_index_list, columns = columns, index = index)

 #Now you have a csv with columns and index:
 pd.to_csv("mylist.csv")
Dinidiniz
источник
5

Решение Амберса также хорошо работает для массивов:

from pylab import *
import csv

array_=arange(0,10,1)
list_=[array_,array_*2,array_*3]
with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(list_)
Семён Мёссингер
источник
4

Если вы не хотите импортировать csvмодуль для этого, вы можете написать список списков в CSV-файл, используя только встроенные модули Python

with open("output.csv", "w") as f:
    for row in a:
        f.write("%s\n" % ','.join(str(col) for col in row))
yellow01
источник
3

Обязательно укажите lineterinator='\n'при создании писателя; в противном случае дополнительная пустая строка может быть записана в файл после каждой строки данных, если источники данных взяты из другого файла CSV ...

Вот мое решение:

with open('csvfile', 'a') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter='    ',quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
for i in range(0, len(data)):
    spamwriter.writerow(data[i])
Яши Ван
источник
3

Как насчет выгрузки списка списков в pickle и восстановления его с помощью модуля pickle ? Это довольно удобно.

>>> import pickle
>>> 
>>> mylist = [1, 'foo', 'bar', {1, 2, 3}, [ [1,4,2,6], [3,6,0,10]]]
>>> with open('mylist', 'wb') as f:
...     pickle.dump(mylist, f) 


>>> with open('mylist', 'rb') as f:
...      mylist = pickle.load(f)
>>> mylist
[1, 'foo', 'bar', {1, 2, 3}, [[1, 4, 2, 6], [3, 6, 0, 10]]]
>>> 
Добрая воля
источник
0

Я получил сообщение об ошибке при следовании примерам с параметром новой строки в функции csv.writer. Следующий код работал для меня.

 with open(strFileName, "w") as f:
    writer = csv.writer(f, delimiter=',',  quoting=csv.QUOTE_MINIMAL)
    writer.writerows(result)
Jie
источник