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
相关产品推荐
相关产品推荐

