在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,如下所示:
hi,dude\r\r\nhi2,dude2\r\r\n
而不是预期的:
hi,dude\r\nhi2,dude2\r\n
为什么会发生这种情况,或者这实际上是期望的行为?
答案 0 :(得分:236)
在Windows上,在将文件传递给csv.reader或csv.writer之前,始终以二进制模式(“rb”或“wb”)打开文件。
虽然文件是文本文件,但CSV被所涉及的库视为二进制格式,“\ r \ n”分隔记录。如果该分隔符是以文本模式编写的,则Python运行库将“\ n”替换为“\ r \ n”,因此将您在文件中观察到的“\ r \ n \ n \ n”替换为。
这个答案发布于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)
...
有关此问题的更多信息,请参阅文档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 =''来删除额外的换行符。