提问人:Francesco 提问时间:11/15/2023 更新时间:11/15/2023 访问量:53
一个 python 脚本中的两个循环
Two loops in one python script
问:
我是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()
答:
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'))
看起来你已经在尝试迭代了:rf
for 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 循环中取出。
评论
res
rf