Создайте файл. csv со значениями из списка Python
Я пытаюсь создать .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
заявление. Как я могу это сделать?
10 ответов:
import csv with open(..., 'wb') as myfile: wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) wr.writerow(mylist)
Edit: это работает только с python 2.x.
чтобы заставить его работать с python 3.X замените
wb
byw
(смотрите это так ответ)with open(..., 'wb', newline='') as myfile: wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) wr.writerow(mylist)
вот защищенная версия Алекса Мартелли:
import csv with open('filename', 'wb') as myfile: wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) wr.writerow(mylist)
лучший вариант, который я нашел, был с помощью
savetxt
С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)
используйте питона
csv
модуль для чтения и записи файлов с разделителями-запятыми или табуляциями. Модуль 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"
вы можете использовать строку.в этом случае метод join.
разделить на несколько строк для ясности-вот интерактивный сеанс
>>> a = ['a','b','c'] >>> first = '", "'.join(a) >>> second = '"%s"' % first >>> print second "a", "b", "c"
или как одна строка
>>> print ('"%s"') % '", "'.join(a) "a", "b", "c"
однако, у вас может возникнуть проблема, что ваши строки имеют встроенные кавычки. Если это так, вам нужно будет решить, как избежать их.
The CSV модуль может позаботиться обо всем этом для вас, позволяя вам выбирать между различными цитатами параметры (все поля, только поля с кавычками и разделителями, только нечисловые поля и т. д.) и как esacpe управляет charecters (двойные кавычки или экранированные строки). Если ваши значения просты, строка.join, вероятно, будет в порядке, но если вам нужно управлять множеством крайних случаев, используйте доступный модуль.
вы должны использовать модуль CSV наверняка , но скорее всего, вам нужно написать unicode . Для тех, кому нужно написать unicode, это класс из страницы примера, который вы можете использовать в качестве модуля util:
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)
вот еще одно решение, которое не требует
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])
Jupyter notebook
допустим, что ваш список
A
затем вы можете закодировать следующее объявление, которое у вас будет в виде csv-файла (только столбцы!)
R="\n".join(A) f = open('Columns.csv','w') f.write(R) f.close()
Это решение звучит безумно, но работает гладко, как мед
import csv with open('filename', 'wb') as myfile: wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n') wr.writerow(mylist)
файл записывается csvwriter, поэтому свойства csv сохраняются, т. е. через запятую. Разделитель помогает в основной части, перемещая элементы списка в следующую строку каждый раз.