Python 3.9文件读写异常求助:读取文件触发ValueError且文件内容被清空
解决Python文件读写的ValueError问题
嘿,我来帮你理清这个问题的根源——这跟Python安装完全没关系,是你对文件打开模式的行为理解有误哦!
问题原因拆解
1. w+模式的隐形坑
当你用w+打开文件时,Python会立刻清空文件内容(这就是你的count.txt变成空白的原因),然后文件指针停在文件开头。
- 第一次调用
f.read()时,因为文件已经被清空,返回的是空字符串,print出来自然啥都没有; - 第二次调用
f.read()时,文件指针已经移到了文件末尾,还是只能读到空字符串,转成int就触发了ValueError: invalid literal for int() with base 10: ''。
2. 为什么r模式也报错?
用r模式打开时,文件不会被清空,但你连续调用了两次f.read():
- 第一次
f.read()已经把整个文件内容(初始的"0")读完了,文件指针直接移到了末尾; - 第二次
f.read()只能读到空字符串,同样触发转int的错误。
正确的解决方案
根据你的需求(读取文件中的数字,加1后写回),推荐两种可靠的写法:
方案一:分开读和写(更直观)
先以只读模式读取内容,再以写入模式更新内容,逻辑清晰不容易出错:
# 读取文件中的数字 with open("count.txt", "r") as f: # strip()处理可能存在的换行、空格等多余字符 current_count = int(f.read().strip()) # 计算新的数值 new_count = current_count + 1 # 写入新数值到文件 with open("count.txt", "w") as f: f.write(str(new_count)) print(new_count) input()
方案二:用r+模式(单次打开文件)
如果想只打开一次文件,可以用r+模式(可读可写,不会清空文件),但需要手动调整文件指针并截断多余内容:
with open("count.txt", "r+") as f: # 读取内容并转成整数 current_count = int(f.read().strip()) new_count = current_count + 1 # 将文件指针移回文件开头 f.seek(0) # 写入新数值 f.write(str(new_count)) # 截断指针后面的内容(防止旧内容长度比新内容长时残留) f.truncate() print(new_count) input()
补充:各文件模式的核心区别
r:只读,文件必须存在,指针默认在开头;w:只写,文件不存在则创建,存在则直接清空;r+:可读可写,文件必须存在,指针默认在开头,不会清空文件;w+:可读可写,文件不存在则创建,存在则直接清空,指针默认在开头。
内容的提问来源于stack exchange,提问作者Elec-citrus
相关产品推荐
相关产品推荐

