You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:57:42