新增内容后排序文本文件遇I/O错误及排序逻辑问题求助
问题分析与解决办法
出错原因
- 文件关闭后仍操作:你代码里执行
file.close()之后,又调用了file.readlines(),此时文件对象已经关闭,自然会触发“I/O operation on closed file”错误。 - 错误调用方法:
eachline是readlines()返回的列表,而split()是字符串专属方法,直接在列表上调用肯定报错。 - 排序逻辑混乱:新增内容后没有正确提取姓名字段进行排序,反而错误复用旧变量,导致按姓名排序的需求完全没实现。
正确可运行代码
while True: # 读取现有文件内容,提取纯姓名(去掉序号) names = [] try: # 用with自动管理文件开闭,避免手动操作出错 with open('s:/not a test.txt', 'r', encoding='utf-8') as f: for line in f: # 按". "分割1次,确保姓名里有小数点也不会拆分错误 name_part = line.strip().split('. ', 1)[1] names.append(name_part) except FileNotFoundError: # 首次运行文件不存在时,直接用空列表 pass n = input("请输入姓名和姓氏:") if not n: break # 添加新输入的姓名 names.append(n.strip()) # 对姓名列表排序 names.sort() # 重新写入文件,生成带正确序号的内容 with open('s:/not a test.txt', 'w', encoding='utf-8') as f: # enumerate从1开始计数,自动生成连续序号 for idx, name in enumerate(names, start=1): f.write(f"{idx}. {name}\n")
代码说明
- 用
with语句处理文件,无需手动调用close(),彻底避免“关闭后操作文件”的问题。 - 提取姓名时用
split('. ', 1),保证即使姓名包含小数点,也只会拆分序号和姓名部分。 - 先收集所有纯姓名排序,再重新生成带序号的内容写入,既实现了姓名排序,又保证序号连续正确。
- 处理了文件不存在的异常,首次运行也能正常执行。
内容的提问来源于stack exchange,提问作者Fox Black
相关产品推荐
相关产品推荐

