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

Python脚本双循环异常:仅转换最后一个.cat文件求解决

问题分析与修复代码

核心问题

你的脚本只处理最后一个文件的原因是:

  1. 初始文件遍历循环中,每次添加新文件到res列表后,都会重新遍历整个res并覆盖rf和wf变量,最终这两个变量仅保留最后一个文件的句柄。
  2. 阶段1循环遍历所有文件时,每次都会覆盖wf[tipo]的输出文件句柄,导致wf只存储最后一个文件的输出文件。
  3. 阶段2错误地遍历单个文件句柄rf(而非文件列表),因此仅处理最后一个文件。
  4. 文件关闭代码存在错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:05:59