我想将数据[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) 我正在尝试获取字典列表中的所有键的列表,以便填写csv.DictWriter的fieldnames参数.
以前,我有这样的事情:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
Run Code Online (Sandbox Code Playgroud)
我正在使用fieldnames = list[0].keys()列表中的第一个字典并提取其密钥.
现在我有这样的东西,其中一个字典有更多的键:值对比其他字典(可能是任何结果).新密钥是根据来自API的信息动态添加的,因此它们可能会或可能不会出现在每个字典中,而且我事先并不知道会有多少新密钥.
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5, "height":4},
{"name": "Pam", "age": 7}
]
Run Code Online (Sandbox Code Playgroud)
我不能只使用fieldnames = list[1].keys()它,因为它不一定是第二个元素将有额外的键.
一个简单的解决方案是找到具有最多键数的字典并将其用于字段名,但如果您有这样的示例,那将无效:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5, "height":4},
{"name": "Pam", "age": 7, "weight":90}
]
Run Code Online (Sandbox Code Playgroud)
其中第二个和第三个字典都有3个键,但最终结果应该是列表 ["name", "age", "height", "weight"]