2012-02-06 34 views
61

我想将类似[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') 

回答

39

你可以使用StringIO,而不是你自己的Dummy_Writer

This module implements a file-like class, StringIO , that reads and writes a string buffer (also known as memory files).

还有cStringIO,这是在一个更快的版本StringIO类。

79

在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' 
+0

很好的例子。 :) 作为旁注,当在CSV文件中遇到换行符时,通常的行为是什么? \ n \ n可以确定在数据中间,但是\ r \ n'表示记录结束,无论它出现在哪里? (假设你在使用'\ r \ n'作为行结束符的平台上)。 – 2012-02-06 08:35:53

+0

我不确定。我本该期待'\ r \ n',因为'io.StringIO()'的默认参数是'newline = None',它启用了通用换行符模式,该模式应该根据您的平台自动使用正确的换行符样式。我自己对这种行为感到困惑。 – 2012-02-06 08:46:33

+0

@ Li-aungYip:我打开了一个[关于这个问题](http://stackoverflow.com/questions/9157623/unexpected-behavior-of-universal-newline-mode-with-stringio-and-csv-modules )。 – 2012-02-06 08:55:33

0

下面是对用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() 
-1
import csv 
from StringIO import StringIO 
with open('file.csv') as file: 
    file = file.read() 

stream = StringIO(file) 

csv_file = csv.DictReader(stream) 
+2

不提供代码的答案,您应该在答案中添加一些说明 – Raniz 2015-06-10 04:23:14

1

我找到了答案,这一切的一切,有点混乱。对于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) 
相关问题