我想将类似[1,2,'a','He said "what do you mean?"']
的数据转换为csv格式的字符串。如何将数据写入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')
很好的例子。 :) 作为旁注,当在CSV文件中遇到换行符时,通常的行为是什么? \ n \ n可以确定在数据中间,但是\ r \ n'表示记录结束,无论它出现在哪里? (假设你在使用'\ r \ n'作为行结束符的平台上)。 – 2012-02-06 08:35:53
我不确定。我本该期待'\ r \ n',因为'io.StringIO()'的默认参数是'newline = None',它启用了通用换行符模式,该模式应该根据您的平台自动使用正确的换行符样式。我自己对这种行为感到困惑。 – 2012-02-06 08:46:33
@ Li-aungYip:我打开了一个[关于这个问题](http://stackoverflow.com/questions/9157623/unexpected-behavior-of-universal-newline-mode-with-stringio-and-csv-modules )。 – 2012-02-06 08:55:33