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)
因为我经常使用它来将结果以 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)