为什么我将此字符串写入StringIO格式化更改?
header = '\r\n'.join(
[unicode(line,'utf8') for line in
['"Text"',
'"More Text"',
'',]])
print header
输出:
"Text"
"More Text"
现在将它添加到我的StringIO中:
si = StringIO.StringIO()
writer = csv.writer(si)
writer.writerow(header))
si.getvalue()
输出:
'"""",T,e,x,t,"""","\r","\n","""",M,o,r,e, ,T,e,x,t,"""","\r","\n"\r\n'
为什么要添加逗号和额外的"
字符?
答案 0 :(得分:2)
这是因为writer.addrow
期望包含元素和字符串的iterable也可以迭代。
即。这段代码:
l = [1,2,3]
for i in l:
print i
将打印:
1
2
3
同样的原则适用于字符串:
s = 'abc'
for c in s:
print c
将打印:
a
b
c
最后,
writer.writerow([1,2,3]) # Gives you 1,2,3
writer.writerow('abc') # Gives you a,b,c
由于header
在您的示例中是一个字符串,因此其中的每个字符都被视为单独的行。然而,这会产生适当的行:
writer.writerow(['abc']) # Gives you abc
最后,许多csv方言在某些元素中包含分隔符时使用引号,即此处的第一个逗号不会被视为分隔符,因为它位于引号内:
writer.writerow(['a,b',3]) # Gives you "a,b",3
当引用字符本身出现在元素中时,它也必须被转义,因此它不会混淆解析器。如果启用了Dialect.doublequote标志,则csv writer会将其加倍:
writer.writerow(['a",b',3]) # "a"",b",3