Python中未输入for循环

问题描述 投票:0回答:1

我有以下 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

我尝试更改缩进,但对我来说似乎是正确的。你有什么主意吗? 非常感谢提前

python for-loop
1个回答
0
投票

我已经向 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

关键调整:

  • 添加了列表 righe_valide 以在第一次通过 CSV 期间存储有效行。
  • 假设您希望在错误检查中包含所有字段,则将 for 循环中的范围更改为 8 而不是 7。根据 CSV 中的实际字段数调整此值。
  • 错误检查后,如果nErr等于0,则迭代righe_valide列表以创建类实例。 请注意,用于创建实例的第二个循环已移至错误检查循环之外,但仍在 if nErr == 0 条件内,以确保它仅在未检测到错误时运行。
  • 这种方法确保每行仅针对错误处理一次,如果没有发现错误,则存储有效行以用于实例创建,从而有效地将验证和处理步骤分开。
© www.soinside.com 2019 - 2024. All rights reserved.