Python中的CSV在Windows上添加了一个额外的换行符
Python中的CSV在Windows上添加了一个额外的换行符
import csv with open('test.csv', 'w') as outfile: writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) writer.writerow(['hi', 'dude']) writer.writerow(['hi2', 'dude2'])
上面的代码会生成一个文件test.csv
,每一行都会多出一个\\r
,如下所示:
hi,dude\r\r\nhi2,dude2\r\r\n
而不是预期的:
hi,dude\r\nhi2,dude2\r\n
为什么会发生这种情况呢?或者这实际上是期望的行为吗?
admin 更改状态以发布 2023年5月23日
虽然@john-machin给了一个很好的答案,但这并不总是最好的方法。例如,在Python 3上,除非你将所有的输入编码到CSV writer中,否则它无法工作。而且,如果脚本想要将sys.stdout作为流使用,它也没有解决这个问题。\n\n我建议在创建写入器时设置\'lineterminator\'属性:\n\n
import csv import sys doc = csv.writer(sys.stdout, lineterminator='\n') doc.writerow('abc') doc.writerow(range(3))
\n\n该示例将在Python 2和Python 3上工作,并且不会产生不需要的换行符。但是请注意,它可能会产生不希望的换行符(在Unix操作系统上省略LF字符)。\n\n然而,在大多数情况下,我认为这种行为比将所有CSV视为二进制格式更可取和更自然。我提供这个答案作为您考虑的一种替代方案。
Python 3:
官方csv
文档推荐在所有平台上使用newline=''
打开文件,以禁用通用换行符转换:
with open('output.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) ...
CSV写入器使用方言的lineterminator
作为每行的终止符。在所有平台上,默认的excel
方言使用'\r\n'
,因为这是RFC 4180推荐的。
Python 2:
在Windows上,使用二进制模式("rb"
或"wb"
)打开文件后,在将其传递给csv.reader
或csv.writer
。
虽然该文件是文本文件,但CSV被相关库视为二进制格式,使用\r\n
分隔记录。如果该分隔符在文本模式下写入,Python运行时会将\n
替换为\r\n
,因此文件中观察到\r\r\n
。
请参阅以前的答案。