Создайте CSV-файл со значениями из списка Python - PullRequest
138 голосов
/ 18 января 2010

Я пытаюсь создать файл .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 ]

203 голосов
/ 18 января 2010
import csv

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

Редактировать: это работает только с Python 2.x.

Чтобы заставить его работать с Python 3.x, замените wb на w ( см. Этот SO-ответ )

with open(..., 'wb', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)
91 голосов
/ 19 февраля 2014

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

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)
27 голосов
/ 13 мая 2015

Лучшим вариантом, который я нашел, было использование 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)
23 голосов
/ 05 июля 2017

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

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)
12 голосов
/ 18 января 2010

Используйте модуль Python 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"
7 голосов
/ 18 января 2010

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

2 голосов
/ 18 апреля 2018

Блокнот Jupyter

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

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

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
1 голос
/ 26 сентября 2018

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

import csv

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

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

1 голос
/ 13 апреля 2016

Вот еще одно решение, для которого не требуется модуль 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])
1 голос
/ 19 января 2015

вы должны обязательно использовать модуль 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)
...