Windows下Python的file.write()写入含\r\n的内容时为何会出现额外换行符?
你遇到的问题其实是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




