一个 python 脚本中的两个循环

Two loops in one python script

提问人:Francesco 提问时间:11/15/2023 更新时间:11/15/2023 访问量:53

问:

我是python的新手,正在尝试在不属于我的脚本中插入一个双循环。

原始脚本读取一个 .cat 文件(来自西班牙地籍),并通过此文件中的结构将其转换为 csv https://github.com/GuillemHerrera/cat2csv/blob/master/catstruct.py

第 1 阶段(使用结构标头创建 csv 文件)的循环有效。步骤 2(读取 .cat 文件并将其转换为 csv)的循环不起作用,因为它仅转换列表中的最后一个文件。有什么帮助吗?

import psycopg2
import csv
import os
from catstruct_14 import catstruct # define la estructura de un .CAT

# Reading folder for .cat files
carpeta_cat= r"C:\Users\ruben\Desktop\Alfanum\CAT"

# Writing folder for .csv files
carpeta_csv= r"C:\Users\ruben\Desktop\Alfanum\CSV"

# Iterate directory
res = [] # list to store files
for file in os.listdir(carpeta_cat):
    # check if current file_path is a file
    if os.path.isfile(os.path.join(carpeta_cat, file)):
        # add filename to list
        res.append(file)
        for i in res:
            rf = open(os.path.join(carpeta_cat, i), encoding='latin-1') # input file
            wf = {} # output files
        print (rf)

# Phase 1
for i in res:
    for tipo in catstruct:
        outname = os.path.splitext(i)[0]+'_cat'+str(tipo)+'.csv'
        print ('Creando ' + outname)
        wf[tipo] = open(carpeta_csv+"//"+outname, 'w')
        # Escribimos primer registro con nombres de campos
        csv.writer(wf[tipo]).writerow(i[3]for i in catstruct[tipo])

    
# Phase 2
for f in rf:
    for line in rf.readlines():
        line = (line.encode('utf-8-sig')).decode('utf-8-sig')
        row = []
        tipo = int(line[0:2])
        # Parseamos si conocemos la estructura del tipo de registro
        if tipo in catstruct:
            for campos in catstruct[tipo]:
                ini = campos[0]-1 # offset
                fin = ini + campos[1] # longitud
                valor = (line[ini:fin].strip().encode("utf-8-sig")).decode('utf-8-sig') # valor
                row.append(valor)
            csv.writer(wf[tipo]).writerow(row) 
            
            
# close input file handle
for f in rf:
    rf[f].close()  


# close output file handles
for f in wf:
    wf[f].close()
Python 循环

评论

1赞 buran 11/15/2023
您遍历输入文件(并且多次迭代 - 不必要),最后是最后一个文件的文件处理程序。重新考虑你在那部分的逻辑resrf

答:

0赞 tomdartmoor 11/15/2023 #1

rf是一个变量,所以每次打开一个新文件时,你都会调用并覆盖 .rf = open(os.path.join(carpeta_cat, i), encoding='latin-1')rf

您可以将其替换为:

###initialise rf
rf = []

然后

###add file to rf
rf.append(open(os.path.join(carpeta_cat, i), encoding='latin-1'))

看起来你已经在尝试迭代了:rffor f in rf:

另外,您不想运行以下内容:

for i in res:
    rf.append(open(os.path.join(carpeta_cat, i), encoding='latin-1')) # input file
    wf = {} # output files

每次找到新文件时,因为您将在 RF 中获得重复的值,因此您应该将其从父 for 循环中取出。