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

Python写入TXT文件失败求助:医院注册系统功能异常

问题分析与解决方案

代码中的核心问题

  • 文件指针与打开模式问题:用r+模式打开文件后,遍历所有行时指针会移到文件末尾,若文件为空或无匹配Procedimento X的行,写入逻辑完全不会触发;且r+要求文件必须存在,否则直接报错。
  • 提前关闭文件:循环内部调用a.close(),若文件有多行匹配目标手术,后续循环会因文件已关闭抛出异常,且关闭后无法再执行写入操作。
  • 日期对象未格式化:计算出的复诊日期是datetime对象,直接写入会保留类型标识(如datetime.datetime(2024, ...)),不符合预期的日期格式。
  • 写入格式混乱:写入字符串中的\n;会导致新行以分号开头,破坏数据分隔结构,后续读取解析会出错。
  • 异常捕获过于宽泛:except:捕获所有异常,包括逻辑错误,不利于定位具体问题;且未处理文件不存在等场景。
  • 缺失模块导入:代码使用datetime和timedelta但未导入datetime模块,会直接触发NameError。

修复后的代码

from datetime import datetime, timedelta

def cadastrar(arq, nomep, proc, x, y, z, w):
    datas = datetime.strptime(w, '%Y-%m-%d')
    l = m = n = o = None
    
    # 先读取文件内容,不存在则创建空列表
    try:
        with open(arq, 'r', encoding='utf-8') as f:
            conteudo = f.readlines()
    except FileNotFoundError:
        conteudo = []
    
    # 检查是否匹配目标手术,计算复诊日期
    for linha in conteudo:
        dados = linha.strip().split(';')
        if len(dados) >= 2 and dados[1].strip() == 'Procedimento X':
            l = datas + timedelta(days=15)
            m = datas + timedelta(days=152)
            n = datas + timedelta(days=304)
            o = datas + timedelta(days=456)
            break  # 匹配到后跳出循环,避免重复计算
    
    # 写入处理后的内容
    if l is not None:
        nova_linha = f"{nomep};{proc};{x}-{y}-{z};{l.strftime('%Y-%m-%d')};{m.strftime('%Y-%m-%d')};{n.strftime('%Y-%m-%d')};{o.strftime('%Y-%m-%d')}\n"
        conteudo.append(nova_linha)
        
        try:
            with open(arq, 'w', encoding='utf-8') as f:
                f.writelines(conteudo)
            print('\033[92m{} foi cadastrado com sucesso.\033[m'.format(nomep))
        except IOError as e:
            print('\033[31mErro ao escrever: {}\033[m'.format(str(e)))
    else:
        print('\033[33mNenhum Procedimento X encontrado no arquivo.\033[m')

关键修复点说明

  • 用with语句管理文件:自动处理文件的打开与关闭,避免手动操作的错误。
  • 分离读取与写入逻辑:先把全部内容读到内存,处理完成后再写入,规避文件指针位置问题。
  • 格式化日期对象:通过strftime('%Y-%m-%d')将datetime对象转为标准日期字符串。
  • 统一数据格式:调整写入的分隔符,确保每行数据结构一致(姓名;手术;日期;复诊1;复诊2;复诊3;复诊4)。
  • 捕获具体异常:针对FileNotFoundError和IOError分别处理,方便定位问题。
  • 添加边界检查:拆分字符串前判断长度,避免索引越界;判断日期变量是否赋值,避免写入无效数据。

内容的提问来源于stack exchange,提问作者tronne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:35:16