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

Python使用w+模式打开文件无法读取,w模式写入清空原文件问题

问题原因
  • 你使用w+模式打开文件时,w类模式的核心特性是打开已存在文件时直接清空所有原有内容,因此你遍历读取时文件已经是空的,自然输出空列表。w+仅适合新建文件的读写场景,不用于修改已有文件。即使你使用其他读写模式,打开文件后指针默认在文件末尾,也需要先调用doc.seek(0)将指针移到文件开头才能读到内容。
  • 你先读再用w模式打开会清空的问题,本质是你只写入了新增内容,没有把之前读取到的原有内容一起写回,才会出现原有内容丢失的情况。
解决方案

方案1:使用r+模式直接读写(适合小文件操作)

r+是读写模式,打开文件时不会清空原有内容,指针默认在文件开头,你可以先读取内容,处理完成后再写入:

with open(path, 'r+', encoding='utf-8') as doc:
    # 读取原有内容
    lines = doc.readlines()
    money = int(lines[0].strip()) if lines else 0
    print(lines)

    # 写入新内容前调整指针、清空残留旧内容
    doc.seek(0)
    doc.truncate()
    # 写入修改后的内容,示例为将金额加200后写回
    doc.write(f"{money + 200}\n")

方案2:先读全量内容,处理后统一写回(稳定性最高)

沿用你原来的思路,只要把原有内容和修改后的内容合并为完整的新内容,再用w模式写回即可,w模式清空是预期行为,写入全量新内容就不会丢失数据:

# 第一步读取全量原有内容
lines = []
with open(path, 'r', encoding='utf-8') as f:
    lines = f.readlines()
money = int(lines[0].strip()) if lines else 0
print(lines)

# 第二步处理内容,示例为修改第一行金额、新增一行内容
lines[0] = f"{money + 200}\n"
lines.append("新增的第二行内容\n")

# 第三步将处理后的完整内容写回
with open(path, 'w', encoding='utf-8') as f:
    f.writelines(lines)

方案3:仅追加内容使用a模式

如果你的需求只是在文件末尾加新内容,不需要修改原有内容,直接用a(追加)模式打开即可,不会清空原有内容,写入的内容自动追加到末尾:

with open(path, 'a', encoding='utf-8') as doc:
    doc.write("追加的新内容\n")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:45:04