Python的csv写入器是否总是使用DOS换行符?

59

我意识到 Python 中的 csv 库总是生成 DOS 的行尾字符,即使我使用 'wb' 模式,甚至在 Linux 中也是如此。

import csv

f = open('output.txt', 'wb');
writer = csv.writer(f)
writer.writerow([2,3,4]);
f.close()

以上代码总是使用'\r\n'作为行结束符。如何让它只使用'\n'


10
CSV MIME规范规定CRLF作为行分隔符:https://tools.ietf.org/html/rfc4180 - Richard Simões
我相信csv的reader始终如一,无法更改,但您只是在询问writer,其默认值可以更改。 - smci
2个回答

95
你可以在构造函数中为 writer 实例提供自定义的 lineterminator 参数:
writer = csv.writer(f, lineterminator="\n")

换行终止符可以由两个字符组合而成吗? - user1479571
如果您跟随lineterminator的文档链接,它会告诉您它是一个字符串,默认值为'\r\n'。所以是的。 - LarsH

34

Niklas的回答所述,lineterminator参数可让您选择行结尾。不要将其硬编码为'\n',而是使用您平台的行分隔符使其与平台无关:os.linesep。另外,在Python 3 中,请确保指定newline=''(请参见此评论)。

import csv
import os

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f, lineterminator=os.linesep)
    writer.writerow([2, 3, 4])

旧解决方案(仅适用于Python 2)

在Python 2中,使用'wb'模式(请参阅文档)。

import csv
import os

with open('output.csv', 'wb') as f:
    writer = csv.writer(f, lineterminator=os.linesep)
    writer.writerow([2, 3, 4])

对于其他人,如果您仍在使用Python 2,请不要错过'wb'。(在Python 3中,此问题由Python处理)。如果您在某些平台上(如GNU / Linux)缺少它,您可能不会注意到问题,但在那些关键的平台上,例如Windows上,以二进制模式打开文件非常重要。否则,csv文件的行末可能会出现像\r\r\n这样的行尾符。如果您使用'wb'os.linesep,则在所有平台上,您的行末应该正确无误。


即使您使编写器“平台无关”,但是您的脚本仍然是平台相关的,因为您需要以二进制形式打开它,但仅在必要时才需要这样做。如果我在Linux上尝试使用wb,则会出现writer.writeheader()的错误。 - Ciprian Tomoiagă
1
我刚在Ubuntu 16.04上尝试了使用writerDictWriterwb,@CiprianTomoiaga,对我来说它可以正常工作。我建议您发布一个新问题,并附上代码示例和错误消息,然后在此处添加一个链接到您的问题的评论。 - Don Kirkby
5
这在Python 3中无法使用。CSV模块假设可以写入常规字符串,但是如果使用'wb'打开文件,则情况不再如此(会出现TypError)。因此,在使用Python 3时,您必须像这样打开文件:f = open('output.csv', 'w', newline='')。还请参阅Python 3 CSV文档 - maxschlepzig
3
请注意,CSV 的主要目的是作为在不同系统之间工作的交换格式。因此,使用 lineterminator=os.linesep 会产生适合于运行脚本的系统的 CSV,但这也意味着所产生的 CSV 取决于脚本运行的位置而会有所不同;这两种情况都不一定适用于消费 CSV 的系统。因此,“平台无关”对于消费者来说可能意味着坚持单一标准,而不是随着生产者的操作系统而变化。 - LarsH
虽然我同意使用操作系统分隔符通常是最好的选择,但我会在Git Bash上运行Python时使用“\n”,否则你会得到混合的行终止符。 - Huw Walters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接