Как мне записать данные в формате CSV в виде строки (не файла)?
Я хочу привести данные типа [1,2,'a','He said "what do you mean?"']
строку в формате CSV.
Обычно для этого следует использовать csv.writer()
, поскольку он обрабатывает все случаи сумасшедшего края (экранирование запятой, экранирование кавычек, диалекты CSV и т.д.). Подвох в том, что csv.writer()
ожидает вывода в файловый объект. не в строку.
Мое текущее решение - это несколько хакерская функция:
def CSV_String_Writeline(data):
class Dummy_Writer:
def write(self,instring):
self.outstring = instring.strip("\r\n")
dw = Dummy_Writer()
csv_w = csv.writer( dw )
csv_w.writerow(data)
return dw.outstring
Кто-нибудь может дать более элегантное решение, которое по-прежнему хорошо обрабатывает крайние случаи?
Редактировать: Вот как я это сделал:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
Ответы
Ответ 1
Вы можете использовать StringIO
вместо своего собственного Dummy_Writer
:
Этот модуль реализует файловый класс StringIO
, который читает и записывает строковый буфер (также известный как файлы памяти).
Существует также cStringIO
, который является более быстрой версией класса StringIO
.
Ответ 2
В Python 3:
>>> import io
>>> import csv
>>> output = io.StringIO()
>>> csvdata = [1,2,'a','He said "what do you mean?"',"Whoa!\nNewlines!"]
>>> writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
>>> writer.writerow(csvdata)
59
>>> output.getvalue()
'1,2,"a","He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'
Некоторые детали нужно немного изменить для Python 2:
>>> output = io.BytesIO()
>>> writer = csv.writer(output)
>>> writer.writerow(csvdata)
57L
>>> output.getvalue()
'1,2,a,"He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'
Ответ 3
Я нашел ответы, в целом, немного запутанным. Для Python 2 это использование работало для меня:
import csv, io
def csv2string(data):
si = io.BytesIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
data=[1,2,'a','He said "what do you mean?"']
print csv2string(data)
Ответ 4
Здесь версия, которая работает для utf-8. csvline2string для одной строки, без прерывания строк в конце, csv2string для многих строк с разрывами строк:
import csv, io
def csvline2string(one_line_of_data):
si = BytesIO.StringIO()
cw = csv.writer(si)
cw.writerow(one_line_of_data)
return si.getvalue().strip('\r\n')
def csv2string(data):
si = BytesIO.StringIO()
cw = csv.writer(si)
for one_line_of_data in data:
cw.writerow(one_line_of_data)
return si.getvalue()
Ответ 5
Поскольку ваш пример имеет только одну строку данных, вы можете просто использовать
input = [1,2,'a','He said "what do you mean?"']
output = ",".join(str(x) for x in input)
Очевидно, что если входные данные имеют более сложную форму, такую как словарь или двумерный массив, этот простой ответ станет более сложным.
Ответ 6
import csv
from StringIO import StringIO
with open('file.csv') as file:
file = file.read()
stream = StringIO(file)
csv_file = csv.DictReader(stream)