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

新增内容后排序文本文件遇I/O错误及排序逻辑问题求助

问题分析与解决办法

出错原因

  1. 文件关闭后仍操作:你代码里执行file.close()之后,又调用了file.readlines(),此时文件对象已经关闭,自然会触发“I/O operation on closed file”错误。
  2. 错误调用方法:eachline是readlines()返回的列表,而split()是字符串专属方法,直接在列表上调用肯定报错。
  3. 排序逻辑混乱:新增内容后没有正确提取姓名字段进行排序,反而错误复用旧变量,导致按姓名排序的需求完全没实现。

正确可运行代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:12:22