如何将数据写入csv格式为string(而不是文件)?
我想把一些数据像[1,2,'a','He said "what do you mean?"']
成一个csv格式的string。
通常人们会使用csv.writer()
,因为它处理所有疯狂的边缘情况(逗号转义,引号标记转义,CSV方言等)。捕获是csv.writer()
期望输出到文件对象,而不是一个string。
我目前的解决scheme是这个有点hackyfunction:
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
任何人都可以给一个更优雅的解决scheme,仍然处理好边缘情况?
编辑:这是我最终做到这一点:
def csv2string(data): si = StringIO.StringIO() cw = csv.writer(si) cw.writerow(data) return si.getvalue().strip('\r\n')
你可以使用StringIO
来代替你自己的Dummy_Writer
:
这个模块实现了一个类文件类
StringIO
,用于读写string缓冲区(也称为内存文件)。
还有cStringIO
,它是StringIO
类的更快版本。
在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'
总之,我发现答案有点混乱。 对于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)
这里是适用于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()
import csv from StringIO import StringIO with open('file.csv') as file: file = file.read() stream = StringIO(file) csv_file = csv.DictReader(stream)