如何将数据写入csv格式为字符串(而不是文件)?

Li-*_*Yip 96 python csv string

我想将数据[1,2,'a','He said "what do you mean?"']转换为csv格式的字符串.

通常人们可以使用csv.writer()它,因为它处理所有疯狂的边缘情况(逗号转义,引用标记转义,CSV方言等).捕获是csv.writer()期望输出到文件对象,而不是字符串.

我目前的解决方案是这个有点hacky函数:

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
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供更优雅的解决方案,仍能很好地处理边缘情况吗?

编辑:这是我最终如何做到这一点:

def csv2string(data):
    si = StringIO.StringIO()
    cw = csv.writer(si)
    cw.writerow(data)
    return si.getvalue().strip('\r\n')
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 130

在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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

  • 应该是`output = StringIO.StringIO()`,`io.StringIO()`将引发TypeError:string参数expect,得到'str'. (2认同)
  • @Marboni:StringIO在Python 3中消失了(这就是我的解决方案),我无法在Python 2.7.3中重现该错误 - 尽管我在`writer.writerow中得到了一个TypeError(... )`line(`unicode参数预期,得到'str'`).请看看这个. (2认同)

NPE*_*NPE 59

您可以使用StringIO而不是自己的Dummy_Writer:

该模块实现了一个类文件类,StringIO它读写字符串缓冲区(也称为内存文件).

还有cStringIO,这是StringIO该类的更快版本.

  • 自 python 3.0 以来,cStringIO 就消失了。请使用 `io.StringIO` 代替 (3认同)

Joh*_*ørn 9

因为我经常使用它来将结果以 csv 数据的形式从sanic异步传输回用户,所以我为Python 3编写了以下代码片段编写了以下代码片段。

该代码片段允许您一遍又一遍地重复使用相同的 StringIo 缓冲区。

import csv
from io import StringIO


class ArgsToCsv:
    def __init__(self, seperator=","):
        self.seperator = seperator
        self.buffer = StringIO()
        self.writer = csv.writer(self.buffer)

    def stringify(self, *args):
        self.writer.writerow(args)
        value = self.buffer.getvalue().strip("\r\n")
        self.buffer.seek(0)
        self.buffer.truncate(0)
        return value + "\n"
Run Code Online (Sandbox Code Playgroud)

例子:

csv_formatter = ArgsToCsv()

output += csv_formatter.stringify(
    10,
    """
    lol i have some pretty
    "freaky"
    strings right here \' yo!
    """,
    [10, 20, 30],
)
Run Code Online (Sandbox Code Playgroud)

在 github gist 上查看更多用法:源代码和测试


小智 5

总而言之,我找到了答案,这有点令人困惑。对于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)
Run Code Online (Sandbox Code Playgroud)