Я хочу преобразовать данные [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')
StringIO()
находится вio
библиотеке.Ответы:
Вы можете использовать
StringIO
вместо своегоDummy_Writer
:Также
cStringIO
есть более быстрая версияStringIO
класса.источник
В Python 3:
Некоторые детали нужно немного изменить для Python 2:
источник
\n
размещать в середине данных, но\r\n
указывает конец записи независимо от того, где она появляется? (Предполагая, что вы находитесь на платформе, которая используется\r\n
в качестве терминатора линии.)output = StringIO.StringIO()
,io.StringIO()
вызовет TypeError: ожидаемый строковый аргумент получил 'str'.writer.writerow(...)
строке (unicode argument expected, got 'str'
). Посмотрим на это.io.BytesIO()
вместоio.StringIO()
.Я нашел ответы, в общем, немного запутанными. Для Python 2 это использование сработало для меня:
источник
так как я довольно часто использую это для асинхронной потоковой передачи результатов от sanic обратно к пользователю в виде данных csv, я написал следующий фрагмент для Python 3 .
Этот фрагмент позволяет повторно использовать один и тот же буфер StringIo снова и снова.
пример:
Ознакомьтесь с дальнейшим использованием на github gist: source и test
источник
источник
Вот версия, которая работает для utf-8. csvline2string только для одной строки без разрывов строк в конце, csv2string для многих строк с разрывами строк:
источник