2016-02-19 73 views
3

当我将这个字符串写入StringIO的格式更改时,该怎么办?使用csv.writer向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

这是因为头已经是一个字符串,然后你遍历的那个人物,所以只是直接删除for循环和写头文件 – SirParselot

+0

@SirParselot我看到,我的非StringIO代码工作的原因是因为它正在使用新行写入所有字符,但是一旦我写入.csv,新行就全部消失。我正在编辑我的问题,我的新问题... – steven

+0

不,我的意思是'在标题循环中的行。 'header'是一个如此循环的字符串,它会给你每个字符,所以'line'实际上是一个字符。 – SirParselot

回答

2

这是因为writer.addrow期望包含元素和字符串的iterable也是可迭代的。

I.e.验证码:

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.writerow(['a",b',3]) # "a"",b",3 
+1

你知道它为什么会加倍报价吗? – SirParselot

+1

@SirParselot:许多CSV方言对带空格的元素使用引号,即:“1 2”,3,“3 4 5”'。所以加倍他们是一种方法来逃避已引用转义的字符串中的引号字符。它在文档中提到:https://docs.python.org/2/library/csv.html#csv.Dialect.doublequote – myaut

+0

啊,这是有道理的。由于没有空格,我没有理解。 – SirParselot

相关问题