Создайте CSV-файл со значениями из списка Python

182

Я пытаюсь создать файл .csv со значениями из списка Python. Когда я печатаю значения в списке, все они имеют Unicode (?), Т.е. они выглядят примерно так

[u'value 1', u'value 2', ...]

Если я перебираю значения в списке, то есть for v in mylist: print vони выглядят как обычный текст.

И я могу положить ,между каждым сprint ','.join(mylist)

И я могу вывести в файл, т.е.

myfile = open(...)
print >>myfile, ','.join(mylist)

Но я хочу вывести в CSV и иметь разделители вокруг значений в списке, например

"value 1", "value 2", ... 

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

Fortilan
источник
Спасибо всем, я объединил идеи из нескольких ответов, чтобы решить мой вопрос :) Теперь я использую модуль csv для записи [...] данных прямо в файл import csv data = [...] myfile = open ( ..., 'wb') out = csv.writer (open ("myfile.csv", "w"), delimiter = ',', quoting = csv.QUOTE_ALL) out.writerow (data) работает хорошо, я строю мои данные [] путем извлечения некоторых данных из электронной таблицы с использованием xlrd, и модуль csv записывает их в файл с правильными разделителями, все хорошо :) снова все
Fortilan
Более поздний подход может заключаться в использовании панд
Ричард
Пользователи Python 3.4, это лучше всего сработало для меня: stackoverflow.com/questions/25022677/…
Leigh,

Ответы:

254
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

Изменить: это работает только с Python 2.x.

Для того, чтобы заставить его работать с питоном 3.x заменить wbс w( см этот SO ответ )

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)
Алекс Мартелли
источник
11
Обратите внимание, что csvмодуль в 2.x не работает должным образом с юникодами; см. документацию модуля для примеров того, как справиться с этим. docs.python.org/library/csv.html
Игнасио Васкес-Абрамс
14
Вы также можете использовать wr.writerows (список)
tovmeod
4
Writerows, кажется, разбивает каждый элемент в списке на столбцы, если каждый элемент также является списком. Это очень удобно для вывода таблиц.
Whatnick
6
Это не работает с питоном 3.4. Я получаю TypeError: 'str' does not support the buffer interface.
Botchniaque
1
Для Python 2 используйте 'w'здесь: stackoverflow.com/questions/34283178/…
banan3'14
106

Вот безопасная версия Алекса Мартелли:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)
Кристиан Гарсия
источник
3
плюс 1 за использование with, убедившись, что файл закрыт, когда закончите
BoltzmannBrain
Если я использую это внутри цикла for, должен ли весь блок with быть вложенным в цикл for? Или было бы эффективнее иметь только wr.writerow(my_list)внутри цикла?
crypdick
1
@crypdick вы не должны помещать весь блок в цикл. Откройте файл, затем запишите каждую строку в цикле. Нет необходимости открывать файл n раз, чтобы записать n строк.
Грег Калека
Если вы записываете строковые объекты в файл, рекомендуется использовать 'wt' при открытии файла, чтобы избежать TypeError: требуется объект, похожий на байты, а не str.
don_Gunner94
41

Для другого подхода вы можете использовать DataFrame в pandas : и он может легко вывести данные в csv, как показано ниже:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)
Qy Zuo
источник
1
Спасибо за этот фрагмент кода, который может оказать некоторую немедленную помощь. Правильное объяснение значительно повысило бы его образовательную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с похожими, но не идентичными вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются.
Тоби Спейт
5
Кроме того, чтобы это работало, списки должны иметь одинаковую длину, в противном случае вы получите ValueError (pandas v 0.22.0)
cheevahagadog
32

Лучший вариант, который я нашел, это использование модуляsavetxt from :numpy

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

Если у вас есть несколько списков, которые нужно сложить

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)
tokenizer_fsj
источник
8
Это хорошо для числовой работы, но не будет работать при отображении строк в списке.
Рикардо Круз
12

Используйте csvмодуль python для чтения и записи файлов с запятой или табуляцией. Модуль CSV является предпочтительным, потому что он дает вам хороший контроль над цитированием.

Например, вот работающий пример для вас:

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

Производит:

"value 1","value 2","value 3"
vy32
источник
4
Выдает пустой файл для меня
caspii
Первый запуск пуст, и вы также не можете удалить его, потому что он открывается в python. Второй запуск (или, если быть более точным, out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))заполняет данные, независимо от того, помещаете вы open("myfile.csv","w")или новый файл open("myfile2.csv","w"). Похоже, что объект out не может иметь дело с файловым объектом, созданным во время выполнения, но сохраняет процесс вывода как задачу. Другими словами: объект out сохраняет объект file при первом запуске, но записывает только тогда, когда объект file уже существует! См. правильное решение ниже @Saurabh Adhikary
Lorenz
7

В этом случае вы можете использовать метод string.join.

Для ясности разделите несколько строк - вот интерактивная сессия

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

Или как одна строка

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

Однако у вас может быть проблема, если в ваших строках есть кавычки. Если это так, вам нужно решить, как избежать их.

Модуль CSV может позаботиться обо всем этом для вас, позволяя вам выбирать между различными вариантами цитирования (все поля, только поля с кавычками и разделителями, только не числовые поля и т. Д.) И как ускорить использование символов управления (двойные кавычки или вырвались струны). Если ваши значения простые, string.join, вероятно, будет в порядке, но если вам приходится управлять множеством крайних случаев, используйте доступный модуль.

Роберт Кристи
источник
3

Это решение звучит безумно, но работает как мед

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

Файл пишется csvwriter, поэтому свойства csv поддерживаются, то есть разделяются запятыми. Разделитель помогает в основной части, каждый раз перемещая элементы списка на следующую строку.

Саураб адхикары
источник
1
Такой маленький и такой быстрый
Ян Самз
1
работает, и если у вас есть вложенный список, расширяющий пример @ vy32, у вас есть:data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
Лоренц
это действительно звучит безумно? Я думаю, что это звучит отлично
Стефани Оуэн
3

Создать и записать в CSV-файл

Приведенный ниже пример демонстрирует создание и запись файла CSV. Для создания динамического средства записи файлов нам нужно импортировать пакет csv , а затем создать экземпляр файла со ссылкой на файл, например: - с открытым ("D: \ sample.csv", "w", newline = "" ) как file_writer

здесь, если файл не существует с указанным файловым каталогом, тогда python создаст тот же файл в указанном каталоге, а «w» представляет запись, если вы хотите прочитать файл, замените «w» на «r» или добавьте к существующему файлу, то "а". newline = "" указывает, что он удаляет лишнюю пустую строку при каждом создании строки, поэтому для удаления пустой строки мы используем newline = "", создаем некоторые имена полей (имена столбцов), используя список, например fields = ["Names", "Age "," Class "] , затем примените к экземпляру Writer, например, writer = csv.DictWriter (file_writer, fieldnames = fields), используя здесь Dictionary Writer и присваивая имена столбцов, чтобы записать имена столбцов в csv, который мы используем writer. в то время как запись значений файла должна быть передана с использованием словарного метода, здесь ключ является именем столбца, а значение является вашим соответствующим значением ключа

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})
прасанна кумар
источник
2

Блокнот Jupyter

Допустим, ваш список A

Затем вы можете написать следующее объявление, и оно будет в виде CSV-файла (только для столбцов!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
rsc05
источник
1

Вы должны использовать модуль CSV наверняка, но есть вероятность, что вам нужно написать Unicode. Для тех, кому нужно написать Unicode, это класс из примера страницы, который вы можете использовать в качестве модуля утилит:

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)
kommradHomer
источник
1

Вот еще одно решение, которое не требует csvмодуля.

print ', '.join(['"'+i+'"' for i in myList])

Пример :

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

Однако, если в первоначальном списке есть некоторые ", они не будут экранированы. Если это необходимо, можно вызвать функцию для ее экранирования следующим образом:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
Ричард
источник