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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:37:46