Python中的CSV在Windows上添加了一个额外的换行符

16 浏览
0 Comments

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日
0
0 Comments

虽然@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视为二进制格式更可取和更自然。我提供这个答案作为您考虑的一种替代方案。

0
0 Comments

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.readercsv.writer

虽然该文件是文本文件,但CSV被相关库视为二进制格式,使用\r\n分隔记录。如果该分隔符在文本模式下写入,Python运行时会将\n替换为\r\n,因此文件中观察到\r\r\n

请参阅以前的答案

0