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

pgccezyw  于 2023-11-14  发布在  其他
关注(0)|答案(7)|浏览(126)

我想把像[1,2,'a','He said "what do you mean?"']这样的数据转换为CSV格式的字符串。
通常情况下,我们会使用csv.writer()来实现这一点,因为它处理了所有疯狂的边缘情况(逗号转义、引号转义、CSV方言等)。
我目前的解决方案是这个有点古怪的函数:

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')

4dc9hkyq

4dc9hkyq1#

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

lhcgjxsq

lhcgjxsq2#

您可以使用StringIO来代替您自己的Dummy_Writer
这个模块实现了一个类似文件的类StringIO,它读取和写入字符串缓冲区(也称为内存文件)。
还有cStringIO,它是StringIO类的更快版本。“

juud5qan

juud5qan3#

由于我经常使用这个方法将结果从sanic异步地以csv数据的形式返回给用户,所以我为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"

字符串
例如:

csv_formatter = ArgsToCsv()

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


在github gist查看更多用法:source and test

ezykj2lf

ezykj2lf4#

总而言之,我发现答案有点令人困惑。对于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)

字符串

fv2wmkja

fv2wmkja5#

下面是适用于utf-8的版本。csvline 2string只适用于一行,结尾没有换行符,csv 2string适用于多行,有换行符:

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()

字符串

mpbci0fu

mpbci0fu6#

我采纳了上面@user2099484的回答,对unicode做了一点小小的修改。

import csv, io

def csv2string(data):
    si = io.BytesIO()
    cw = csv.writer(si)
    data = [f.encode('utf-8') if type(f) == unicode else f for f in data]
    cw.writerow(data)
    return si.getvalue().strip('\r\n')

data=[1,2,'a','He said "what do you mean?"']
print csv2string(data)
data2=[1,2,u'שלום','He said "what do you mean?"']
print csv2string(data2)

字符串

13z8s7eq

13z8s7eq7#

import csv
from StringIO import StringIO
with open('file.csv') as file:
    file = file.read()

stream = StringIO(file)

csv_file = csv.DictReader(stream)

字符串

相关问题