Python中的CSV在Windows上添加额外的回车符

时间:2010-07-07 02:34:25

标签: python windows csv newline

在Windows XP专业版上运行的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 \ n,如下所示:

test.csv

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

而不是预期的:

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

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

7 个答案:

答案 0 :(得分:236)

在Windows上,在将文件传递给csv.reader或csv.writer之前,始终以二进制模式(“rb”或“wb”)打开文件。

虽然文件是文本文件,但CSV被所涉及的库视为二进制格式,“\ r \ n”分隔记录。如果该分隔符是以文本模式编写的,则Python运行库将“\ n”替换为“\ r \ n”,因此将您在文件中观察到的“\ r \ n \ n \ n”替换为。

请参阅this previous answer


这个答案发布于2010年,并没有解决Python3中的问题。

如@ YiboYang的回答所述,Python3中的一个可能的修复方法是打开文件,并将newline参数设置为空字符串:

f = open(path_to_file, 'w', newline='')
writer = csv.writer(f)
...
...

答案 1 :(得分:221)

虽然@john-machin给出了一个很好的答案,但并不总是最好的方法。例如,除非您将所有输入编码为CSV编写器,否则它不适用于Python 3。此外,如果脚本想要使用sys.stdout作为流,它也无法解决问题。

我建议在创建编写器时设置'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视为二进制格式更为可取且更自然。我提供这个答案作为您考虑的替代方案。

答案 2 :(得分:48)

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

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

根据documentation

有关此问题的更多信息,请参阅文档footnote

  

如果换行=''未指定,新行嵌入在引用字段中   将无法正确解释,并且在使用\ r \ n的平台上   写入额外\ r \ n的线条将被添加。它应该永远是   可以安全地指定newline ='',因为csv模块有自己的功能   (通用)换行处理。

答案 3 :(得分:4)

我不确定为什么会发生这种情况,但是将文件模式从“w”更改为“wb”会修复它。有关详细信息,请参阅我对“how to remove ^M”的回答。

答案 4 :(得分:3)

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="text-block">
Jim, Mike, Ali, and Marsha went to the store.
</div>

答案 5 :(得分:1)

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

return redirect('profile', context)

答案 6 :(得分:1)

注意,如果你使用DictWriter,你将有一个来自open函数的新行和来自writerow函数的新行。 您可以在open函数中使用newline =''来删除额外的换行符。