Python脚本双循环异常:仅转换最后一个.cat文件求解决
问题分析与修复代码
核心问题
你的脚本只处理最后一个文件的原因是:
- 初始文件遍历循环中,每次添加新文件到
res列表后,都会重新遍历整个res并覆盖rf和wf变量,最终这两个变量仅保留最后一个文件的句柄。 - 阶段1循环遍历所有文件时,每次都会覆盖
wf[tipo]的输出文件句柄,导致wf只存储最后一个文件的输出文件。 - 阶段2错误地遍历单个文件句柄
rf(而非文件列表),因此仅处理最后一个文件。 - 文件关闭代码存在错误:
rf是单个文件对象,不是字典,循环for f in rf:会引发异常。
修复后的代码
import psycopg2 import csv import os from catstruct_14 import catstruct # define la estructura de un .CAT # 文件夹路径 carpeta_cat = r"C:\Users\ruben\Desktop\Alfanum\CAT" carpeta_csv = r"C:\Users\ruben\Desktop\Alfanum\CSV" # 收集所有.cat文件的完整路径 res = [] for file in os.listdir(carpeta_cat): file_path = os.path.join(carpeta_cat, file) if os.path.isfile(file_path) and file.lower().endswith('.cat'): res.append(file_path) # 逐个处理每个.cat文件 for file_path in res: filename = os.path.basename(file_path) base_name = os.path.splitext(filename)[0] # 阶段1:创建带表头的CSV文件 wf = {} for tipo in catstruct: outname = f"{base_name}_cat{tipo}.csv" out_path = os.path.join(carpeta_csv, outname) print(f"Creando {outname}") # 打开输出文件,newline=''避免Windows下CSV出现空行 wf[tipo] = open(out_path, 'w', newline='', encoding='utf-8') # 写入表头 csv.writer(wf[tipo]).writerow(field[3] for field in catstruct[tipo]) # 阶段2:读取.cat文件并转换为CSV with open(file_path, encoding='latin-1') as rf: for line in rf: # 移除换行符并处理编码 line = line.rstrip('\n') line = line.encode('utf-8-sig').decode('utf-8-sig') tipo = int(line[0:2]) if tipo in catstruct: row = [] for campos in catstruct[tipo]: ini = campos[0] - 1 # 转换为0索引 fin = ini + campos[1] valor = line[ini:fin].strip().encode('utf-8-sig').decode('utf-8-sig') row.append(valor) # 写入对应类型的CSV文件 csv.writer(wf[tipo]).writerow(row) # 关闭当前文件的所有输出句柄 for f in wf.values(): f.close() print("所有文件处理完成")
关键修复点
- 逐个处理文件:不再一次性收集所有文件句柄,而是逐个处理每个
.cat文件,避免句柄被覆盖。 - 独立的输出文件集合:每个
.cat文件对应自己的wf字典,确保不同文件的输出不会互相覆盖。 - 使用
with语句:自动管理输入文件的打开与关闭,避免资源泄漏。 - 规范路径处理:用
os.path.join替代硬编码的路径分隔符,提升跨平台兼容性。 - 编码与换行处理:添加
newline=''避免CSV空行问题,明确编码设置确保字符正确转换。
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

