如何将数据以字符串(而非文件)的形式写入 CSV 格式?
- 2025-04-16 08:57:00
- admin 原创
- 16
问题描述:
我想将数据转换为[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("
")
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('
')
解决方案 1:
在 Python 3 中:
>>> import io
>>> import csv
>>> output = io.StringIO()
>>> csvdata = [1,2,'a','He said "what do you mean?"',"Whoa!
Newlines!"]
>>> writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
>>> writer.writerow(csvdata)
59
>>> output.getvalue()
'1,2,"a","He said ""what do you mean?""","Whoa!
Newlines!"
'
对于 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!
Newlines!"
'
解决方案 2:
您可以使用StringIO
而不是您自己的Dummy_Writer
:
该模块实现了一个类似文件的类
StringIO
,可以读取和写入字符串缓冲区(也称为内存文件)。
还有cStringIO
,这是该类的更快版本StringIO
。
解决方案 3:
由于我经常使用它将结果从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("
")
self.buffer.seek(0)
self.buffer.truncate(0)
return value + "
"
例子:
csv_formatter = ArgsToCsv()
output += csv_formatter.stringify(
10,
"""
lol i have some pretty
"freaky"
strings right here \' yo!
""",
[10, 20, 30],
)
查看更多用法,请访问 github gist:源代码和测试
解决方案 4:
总而言之,我发现答案有点令人困惑。对于Python 2,这种用法对我有用:
import csv, io
def csv2string(data):
si = io.BytesIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('
')
data=[1,2,'a','He said "what do you mean?"']
print csv2string(data)
解决方案 5:
我采纳了上面@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('
')
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)
解决方案 6:
这是适用于 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('
')
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()
解决方案 7:
import csv
from StringIO import StringIO
with open('file.csv') as file:
file = file.read()
stream = StringIO(file)
csv_file = csv.DictReader(stream)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD