You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows下Python的file.write()写入含\r\n的内容时为何会出现额外换行符?

问题根源:Python文本模式的自动换行符转换

你遇到的问题其实是Python文本模式下的换行符自动转换机制在搞鬼,这是Windows平台特有的细节,很容易被忽略。

为什么会出现双CRLF?

当你用open("dump.txt", "w+")打开文件时,默认是文本模式(等价于w+t)。在Windows系统中,文本模式会自动将Python代码里的\n转换成Windows标准的行结束符\r\n

你手动在写入的字符串末尾加了\r\n,相当于告诉Python要写入\r\n,但文本模式又会把其中的\n再转成\r\n,最终写入文件的内容就变成了\r\r\n——也就是两个CRLF,这就导致Notepad++里能看到每行后面有两个换行标记,读出来的时候自然会出现多余的空行。

怎么解决?

有两种常用方案,根据你的需求选择:

方案1:让Python自动处理平台对应的EOL(推荐)

既然你希望脚本自动适配运行平台的行结束符,那只需要在写入时只用\n,剩下的交给Python的文本模式处理就行:

with open("dump.txt", "w+") as file:
    for x in range(1, 10):
        file.write(str(x) + "\n")

这样在Windows下,Python会自动把\n转换成\r\n,和记事本手动创建的文件格式完全一致;如果脚本跑到Linux/macOS上,就会写入\n,完美实现跨平台适配。

读取的时候也用文本模式,Python会自动把平台的EOL转换成\n,输出时不会有多余空行:

import sys
with open("dump.txt", "r") as infile:
    for line in infile:
        sys.stdout.write(line)

(或者更简单用print(line, end=''),因为print默认会追加\n,而line本身已经包含换行符了)

方案2:用二进制模式精确控制换行符

如果你一定要手动指定\r\n,不想让Python自动转换,那就要用二进制模式打开文件(wb+),这样写入的内容会原封不动保存到文件里:

with open("dump.txt", "wb+") as file:
    for x in range(1, 10):
        # 字符串要转成字节流才能写入二进制文件
        file.write((str(x) + "\r\n").encode('utf-8'))

读取的时候也要用二进制模式(rb),然后自己解码成字符串:

import sys
with open("dump.txt", "rb") as infile:
    for line_bytes in infile:
        line = line_bytes.decode('utf-8')
        sys.stdout.write(line)

这种方式适合你需要严格控制文件字节内容的场景,但缺点是跨平台性差,在非Windows系统下会写出Windows风格的换行符。

补充:记事本和Notepad++的差异

记事本(Notepad)对换行符的兼容性比较差,只认\r\n作为换行;而Notepad能识别多种换行符,并且会显示出具体的换行标记,所以能直观看到双CRLF的问题,这也是为什么你在记事本里看起来正常,但Notepad里能发现异常的原因。

内容的提问来源于stack exchange,提问作者Siedler

火山引擎 最新活动