Как мне записать данные в формате CSV в виде строки (не файла)? - PullRequest
88 голосов
/ 06 февраля 2012

Я хочу привести данные типа [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')

Ответы [ 6 ]

123 голосов
/ 06 февраля 2012

В 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'
51 голосов
/ 06 февраля 2012

Вы можете использовать StringIO вместо своего Dummy_Writer:

Этот модуль реализует файловый класс StringIO, который читает и записывает строковый буфер (также известный как файлы памяти).

* * 1010

Существует также cStringIO, который является более быстрой версией класса StringIO.

5 голосов
/ 28 октября 2015

Я нашел ответы, в общем, немного запутанным.Для 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)
0 голосов
/ 10 апреля 2019

Поскольку в вашем примере есть только одна строка данных, вы можете просто использовать

input = [1,2,'a','He said "what do you mean?"']
output = ",".join(str(x) for x in input)

Очевидно, что если входные данные имеют более сложную форму, такую ​​как словарь или двумерный массив, этот простой ответ станет более сложным.

0 голосов
/ 09 июня 2015
import csv
from StringIO import StringIO
with open('file.csv') as file:
    file = file.read()

stream = StringIO(file)

csv_file = csv.DictReader(stream)
0 голосов
/ 05 мая 2015

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