在 Windows 上,Python 中的 CSV 添加了额外的回车符
- 2024-12-16 08:35:00
- admin 原创
- 151
问题描述:
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
一个额外内容`
`,如下所示:
hi,dude
hi2,dude2
而不是预期的
hi,dude
hi2,dude2
为什么会发生这种情况,或者这实际上是期望的行为吗?
解决方案 1:
Python 3:
官方csv
文档建议在所有平台上open
使用该文件来禁用通用换行符翻译:newline=''
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
...
CSV 编写器以lineterminator
方言的来终止每一行,这是所有平台上的`'
'默认
excel`方言,因为这是RFC 4180所推荐的。
Python 2:
在 Windows 上,在将文件传递给或之前,请始终以二进制模式("rb"
或)打开文件。"wb"
`csv.reader`csv.writer
尽管该文件是文本文件,但相关库将CSV 视为二进制`格式,并带有分隔记录。如果该分隔符以文本模式编写,则 Python 运行时会将 替换为
,
因此
`文件中会显示 。
请参阅先前的答案。
解决方案 2:
虽然@john-machin给出了一个很好的答案,但这并不总是最好的方法。例如,除非您将所有输入都编码到CSV编写器中,否则它在Python 3上不起作用。此外,如果脚本想要使用sys.stdout作为流,它也无法解决问题。
我建议在创建编写器时设置“lineterminator”属性:
import csv
import sys
doc = csv.writer(sys.stdout, lineterminator='
')
doc.writerow('abc')
doc.writerow(range(3))
该示例适用于 Python 2 和 Python 3,不会产生不需要的换行符。但请注意,它可能会产生不需要的换行符(在 Unix 操作系统上省略 LF 字符)。
然而,在大多数情况下,我认为这种行为比将所有 CSV 视为二进制格式更可取、更自然。我提供此答案作为替代方案供您考虑。
解决方案 3:
在 Python 3 中(我还没有在 Python 2 中尝试过),你也可以简单地这样做
with open('output.csv','w',newline='') as f:
writer=csv.writer(f)
writer.writerow(mystuff)
...
按照文件。
有关此内容的更多信息,请参阅文档的脚注:
如果未指定 newline='',则无法正确解释引号字段内嵌入的换行符,并且在使用 \r\n 换行符的平台上,写入时会添加额外的 \r。指定 newline='' 应该始终是安全的,因为 csv 模块会执行其自己的(通用)换行符处理。
解决方案 4:
您可以在 csv writer 命令中引入 lineterminator='\n'参数。
import csv
delimiter=' '
with open('tmp.csv', '+w', encoding='utf-8') as stream:
writer = csv.writer(stream, delimiter=delimiter, quoting=csv.QUOTE_NONE, quotechar='', lineterminator='
')
writer.writerow(['A1' , 'B1', 'C1'])
writer.writerow(['A2' , 'B2', 'C2'])
writer.writerow(['A3' , 'B3', 'C3'])
解决方案 5:
您必须添加属性 newline="\n" 才能打开如下函数:
with open('file.csv','w',newline="
") as out:
csv_out = csv.writer(out, delimiter =';')
解决方案 6:
请注意,如果您使用 DictWriter,您将从 open 函数获得一个新行,并从 writerow 函数获得一个新行。您可以在 open 函数中使用 newline='' 来删除多余的换行符。