我有以下 py 函数,该函数从 CSV 文件开始应该创建我在代码中上面某处定义的类的实例。我的问题是,它在 if nErr == 0 之后不运行 for 循环。它只打印“Here I am”。
def checkCSV_creaIstanze(fileCSV, istanze): # la funzione controlla i campi del CSV - se è tutto ok crea le istanze
with open(fileCSV, newline='') as file_csv:
lettore_csv = csv.reader(file_csv, delimiter=';')
next(lettore_csv) # salto header csv
nErr = 0
for riga in lettore_csv:
for i in range(0,7):
if riga[i] == '':
print(f'riga {lettore_csv.line_num-1} - colonna {i+1}: dato assente')
nErr += 1
if i == 1:
if len(riga[i]) != 11:
print(f'riga {lettore_csv.line_num-1} {riga[0]} - codice fiscale non coerente: {riga[i]}')
nErr += 1
if i == 2:
if len(riga[i]) != 2:
print(f'riga {lettore_csv.line_num-1} {riga[0]} - codice stato non coerente: {riga[i]}')
nErr += 1
if nErr == 0:
print('here I am')
for riga in lettore_csv:
print('dati coerenti\ncreo istanze di classe...')
Sgr = SGR(riga[0], riga[1], riga[2], riga[3], riga[4], riga[5], riga[6], riga[7], riga[8])
istanze.append(Sgr)
# print('istanze cerate')
else:
print('si è verificato un problema')
return istanze
我尝试更改缩进,但对我来说似乎是正确的。你有什么主意吗? 非常感谢提前
我已经向 ChatGPT4 询问了您在这里提出的确切问题。这是我得到的答案:
聊天PGT4: 代码中的问题源于您尝试重用 lettore_csv 迭代器的方式。一旦第一个 for 循环迭代 lettore_csv 完成,迭代器就会到达 CSV 文件的末尾,并且没有更多的行可以迭代。当您在检查 nErr == 0 后尝试再次循环 lettore_csv 时,迭代器已经位于文件末尾,这会导致第二个循环不执行。
此问题的一个简单解决方案是在第一次传递后将 CSV 文件的行存储在列表中,然后迭代此列表以创建实例,而不是尝试重用 lettore_csv 迭代器。您可以通过以下方式调整函数来实现此目的:
import csv
def checkCSV_creaIstanze(fileCSV, istanze):
# Open the CSV file
with open(fileCSV, newline='') as file_csv:
lettore_csv = csv.reader(file_csv, delimiter=';')
next(lettore_csv) # Skip the header
nErr = 0
righe_valide = [] # List to store valid rows
# First pass: Check for errors
for riga in lettore_csv:
for i in range(0, 8): # Assuming you have 8 fields to check, adjust accordingly
if riga[i] == '':
print(f'riga {lettore_csv.line_num-1} - colonna {i+1}: dato assente')
nErr += 1
if i == 1 and len(riga[i]) != 11:
print(f'riga {lettore_csv.line_num-1} {riga[0]} - codice fiscale non coerente: {riga[i]}')
nErr += 1
if i == 2 and len(riga[i]) != 2:
print(f'riga {lettore_csv.line_num-1} {riga[0]} - codice stato non coerente: {riga[i]}')
nErr += 1
if nErr == 0:
righe_valide.append(riga) # Add valid row to the list
# Check if errors were found
if nErr == 0:
print('Dati coerenti\nCreo istanze di classe...')
# Second pass: Create instances from the stored valid rows
for riga in righe_valide:
Sgr = SGR(riga[0], riga[1], riga[2], riga[3], riga[4], riga[5], riga[6], riga[7], riga[8])
istanze.append(Sgr)
else:
print('Si è verificato un problema')
return istanze
关键调整: