如何将数据写入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)