使用r+模式写入\n为何替换两个字符?文件读写结果不符预期
问题原因分析与解决方案
这事儿核心问题出在文本模式下的换行符自动转换上,咱们一步步拆解:
1. 先搞懂你遇到的现象
你的test.txt原本是12345,执行代码后变成了「空行+345」,相当于开头的12被替换成了换行——这并不是你写的\n本身占了两个字符,而是Windows系统下Python的文本模式会自动把\n转换成\r\n(也就是回车+换行,两个ASCII字符)。
2. 为什么会这样?
当你用open("test.txt", "r+")打开文件时,默认是文本模式(不加b参数)。在Windows系统中,文本模式有个「换行符转换」的默认行为:
- 读取文件时,会把磁盘上的
\r\n转换成Python里的\n; - 写入文件时,会把Python里的
\n转换成磁盘上的\r\n。
所以你代码里写的dfh.write("\n"),实际往文件里写的是\r\n两个字符,这就把原文件开头的1和2给覆盖掉了,剩下的内容自然就是345,再加上换行的显示效果,就成了你看到的「空行+345」。
3. 怎么解决?
如果想让写入的\n只占一个字符,避免覆盖多余内容,有两种方法:
方法一:用二进制模式打开文件
把打开方式改成rb+,这样就不会触发换行符的自动转换,写入的\n就是单个字符:dfh = open("test.txt", "rb+") dfh.seek(0, 0) dfh.write(b"\n") # 注意这里要写字节串 dfh.close()这样操作后,文件内容就会变成「\n2345」,显示出来就是空行+2345,符合你的预期。
方法二:手动指定换行符参数
在打开文件时加上newline='',关闭自动转换功能,这样写入的\n也会被原样写入:dfh = open("test.txt", "r+", newline='') dfh.seek(0, 0) dfh.write("\n") dfh.close()
补充验证小技巧
你可以用二进制模式读取修改后的文件,看看实际内容:
with open("test.txt", "rb") as f: print(f.read())
如果是文本模式写入的\n,输出会是b'\r\n345';如果是二进制模式写入的,输出就是b'\n2345',一眼就能看明白差异~
内容的提问来源于stack exchange,提问作者cavalist
相关产品推荐
相关产品推荐

