Создайте файл. 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 113

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 by w (смотрите это так ответ)

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"

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

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

вы можете использовать строку.в этом случае метод 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 сохраняются, т. е. через запятую. Разделитель помогает в основной части, перемещая элементы списка в следующую строку каждый раз.