Python中的CSV添加额外的回车

在Windows XP Pro上运行的Python 2.7中:

import csv outfile = file('test.csv', 'w') writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) writer.writerow(['hi','dude']) writer.writerow(['hi2','dude2']) outfile.close() 

它会在每一行生成一个文件test.csv,并带有一个额外的\ r,如下所示:

test.csv

 hi,dude\r\r\nhi2,dude2\r\r\n 

而不是预期的:

 hi,dude\r\nhi2,dude2\r\n 

为什么会发生这种情况,或者这实际上是期望的行为?

在Windows上,始终以二进制模式(“rb”或“wb”)打开文件,然后将它们传递到csv.reader或csv.writer。

CSV实际上是一种二进制格式,用“\ r \ n”分隔logging。 如果该分隔符是以文本模式编写的,则Python运行时会将“\ n”replace为“\ r \ n”,因此您在文件中观察到了“\ r \ r \ n”。

看到这个以前的答案 。

@ john-machin给出了一个很好的答案,但并不总是最好的办法。 例如,除非您将所有input编码到CSV编写器,否则它不适用于Python 3。 而且,如果脚本想要使用sys.stdout作为stream,则不会解决问题。

我build议在创build编写器时设置'lineterminator'属性:

 import csv import sys doc = csv.writer(sys.stdout, lineterminator='\n') doc.writerow('abc') doc.writerow(range(3)) 

这个例子将在Python 2和Python 3上工作,不会产生不需要的换行符。 但是请注意,它可能会产生不需要的换行符(在Unix操作系统上省略LF字符)。

然而,在大多数情况下,我认为行为比将所有CSV视为二进制格式更可取,更自然。 我提供这个答案作为您考虑的替代scheme。

在Python 3中(我还没有在Python 2中尝试过),你也可以简单的做

 with open('output.csv','w',newline='') as f: writer=csv.writer(f) writer.writerow(mystuff) ... 

根据文件 。

更多关于这个在文件的脚注 :

如果未指定newline ='',embedded在引用字段中的换行符将不会被正确解释,并且在使用\ r \ n结点的平台上写入额外的\ r将被添加。 指定newline =''应该总是安全的,因为csv模块执行自己的(通用)换行处理。

我不确定它为什么会发生,但是将文件模式从“w”更改为“wb”可以修复它。 有关更多详细信息,请参阅我的“ 如何删除^ M ”的答案。

你必须添加属性newline =“\ n”打开这样的function:

 with open('file.csv','w',newline="\n") as out: csv_out = csv.writer(out, delimiter =';') 

您可以在csv writer命令中引入lineterminator ='\ n'参数。

 import csv delimiter='\t' with open('tmp.csv', '+w', encoding='utf-8') as stream: writer = csv.writer(stream, delimiter=delimiter, quoting=csv.QUOTE_NONE, quotechar='', lineterminator='\n') writer.writerow(['A1' , 'B1', 'C1']) writer.writerow(['A2' , 'B2', 'C2']) writer.writerow(['A3' , 'B3', 'C3']) 

请注意,如果您使用DictWriter,则将从打开的函数和writerow函数的一个新行中创build一个新行。 你可以在open函数中使用newline =''来删除多余的换行符。