Python文件操作报错io.UnsupportedOperation: not readable及相关问题咨询
Python文件操作问题解答
报错原因与修正
你用open("Status.txt", "x")打开文件时,"x"模式是创建新文件且仅支持写入,所以调用read()会触发io.UnsupportedOperation: not readable错误。而且刚用"x"创建的文件是空的,读取也得不到有效内容。
如果你的需求是:文件不存在就创建,存在就读取内容,再写入新内容,可参考以下修正代码:
import os # 文件不存在则创建空文件 if not os.path.exists("Status.txt"): with open("Status.txt", "w") as f: pass # 读取文件内容 with open("Status.txt", "r") as Status: UserName = Status.read().strip() # 去除首尾空白字符 # 写入新内容 with open("Status.txt", "w") as StatusFileWrite: StatusFileWrite.write(f"Hello {UserName} :)")
如果要在创建文件后立即完成读写操作,可使用"x+"模式(创建新文件并支持读写),但需注意文件指针位置:
with open("Status.txt", "x+") as f: UserName = f.read().strip() # 刚创建的文件为空,读取结果是空字符串 f.seek(0) # 移动指针到文件开头 f.write(f"Hello {UserName} :)") f.truncate() # 截断多余内容(确保旧内容被完全覆盖)
文件创建后立即修改内容
常用两种实现方式:
- 使用
"x+"模式:创建新文件的同时开启读写权限,读取后通过f.seek(0)将指针移到文件开头,再执行写入操作,最后用f.truncate()截断多余内容。 - 分两步操作:先用
"x"或"w"模式创建文件并关闭,再用"r+"或"w"模式重新打开修改,但这种方式会多一次IO操作,效率不如前者。
指定读取文件的某一行
推荐三种实用方法:
- 方法一(小文件适用):用
readlines()将所有行加载为列表,通过索引获取目标行(索引从0开始):with open("Status.txt", "r") as f: lines = f.readlines() # 获取第2行(对应索引1) if len(lines) >= 2: target_line = lines[1].strip() - 方法二(大文件适用):循环遍历文件,计数匹配目标行号,无需加载全部内容到内存:
target_line_num = 3 # 要获取第3行 result_line = None with open("Status.txt", "r") as f: current_num = 0 for line in f: current_num += 1 if current_num == target_line_num: result_line = line.strip() break - 方法三(简洁写法):用
enumerate()简化计数逻辑,直接让索引对应行号:target_line_num = 3 with open("Status.txt", "r") as f: for idx, line in enumerate(f, start=1): # start=1让索引从1开始 if idx == target_line_num: result_line = line.strip() break
内容的提问来源于stack exchange,提问作者Smorpy
相关产品推荐
相关产品推荐

