使用csv.writer将字符串写入StringIO,为什么要添加额外的字符?

时间:2016-02-19 20:30:08

标签: python python-2.7 csv

为什么我将此字符串写入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'

为什么要添加逗号和额外的"字符?

1 个答案:

答案 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