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
相关产品推荐
相关产品推荐

