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

2024-04-19 03:16:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: csvtestimportaswithopenhioutfile
3条回答

虽然@john-machin给出了一个很好的答案,但它并不总是最好的方法。例如,除非将所有输入编码到CSV编写器,否则它在Python3上不起作用。此外,如果脚本希望使用sys.stdout作为流,它也没有解决这个问题

我建议在创建编写器时改为设置“lineterminator”属性:

import csv
import sys

doc = csv.writer(sys.stdout, lineterminator='\n')
doc.writerow('abc')
doc.writerow(range(3))

该示例适用于Python2和Python3,不会产生不需要的换行符。但是,请注意,它可能会产生不需要的换行符(在Unix操作系统上省略LF字符)

然而,在大多数情况下,我相信行为比将所有CSV作为二进制格式处理更可取、更自然。我提供这个答案作为您考虑的替代方案

Python 3:

官方^{} documentation建议open在所有平台上newline=''使用newline=''文件disable universal newlines translation

with open('output.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    ...

CSV编写器用^{} of the dialect终止每一行,这是所有平台上默认的excel方言的'\r\n',因为这是RFC 4180推荐的


Python 2:

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

尽管该文件是一个文本文件,但所涉及的库将CSV视为二进制格式,其中\r\n分隔记录。如果该分隔符是以文本模式编写的,则Python运行时将\n替换为\r\n,从而在文件中观察到\r\r\n

this previous answer

在Python3中(我没有在Python2中尝试过),您也可以简单地执行以下操作

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

根据documentation

有关这方面的更多信息,请参阅文件footnote

If newline='' is not specified, newlines embedded inside quoted fields will not be interpreted correctly, and on platforms that use \r\n linendings on write an extra \r will be added. It should always be safe to specify newline='', since the csv module does its own (universal) newline handling.

相关问题 更多 >