for i, line in enumerate(lines):
    testIDLines.append(line)
        if line.find("TEXT") > 0:
            for row in csvFile:
                dosomething
                if dosomething = True:
                    break
                else:
                    continue

Tengo un pequeño problema dentro de este código: la primera iteración funciona perfectamente, pero cuando entro en el segundo bucle otra vez, for row in csvFile no comienza al comienzo del archivo csv, sino donde dejó el bucle la última vez .

CsvFile Variable es un diccionario creado con csvFile = csv.DictReader(open("Filename.csv"))

¿Hay alguna manera de restablecer la variable de archivo csv para comenzar desde la primera fila? ¿O cómo puede suceder esto, que la variable de archivo csv en este caso se toque cuando hago un for row in csvFile

1
Dominik Lemberger 3 oct. 2019 a las 15:51

3 respuestas

La mejor respuesta

csv.DictReader usa un iterador interno que se crea a partir del descriptor de archivo pasado. Que a su vez usa un iterador de archivo para iterar sobre los datos. Entonces, como dijo @Maciej, debe restablecer la posición del archivo con seek.

Para hacerlo, debe guardar el valor del descriptor de archivo antes de pasarlo a DictReader. Por cierto, tiene una fuga allí tan cerca que no se llamará.

with open("Filename.csv") as csvFile:
  csvDict = csv.DictReader(csvFile)
  ...
    for i, line in enumerate(lines):
        testIDLines.append(line)
            if line.find("TEXT") > 0:
                    for row in csvDict:
                        dosomething
                        if dosomething = True:
                            break
                        else:
                            continue
                    csvFile.seek(0) # reset iteration

Pero si sus archivos no son grandes, es mejor simplemente almacenar en caché los datos antes de la iteración en dict y luego usarlos en el cálculo para que no haya llamadas IO redundantes.

1
j2ko 9 oct. 2019 a las 08:43

Una mirada a la (cpython) implementación de DictReader, especialmente la implementación __next__, muestra que internamente itera sobre las líneas del archivo (usando un csv.reader) y analiza cada línea como un dict. Iterar una segunda vez en el mismo objeto sin seek llevar el archivo a 0 (es decir, el comienzo) no funcionará, porque el lector todavía está al final del archivo.

¿Hay alguna manera de restablecer la variable csvFile para comenzar desde la primera fila?

No parece ser sencillo. Debe buscar el archivo subyacente en 0, pero también debe restablecer el reader dentro de su DictReader (y posiblemente otro estado). La solución más simple (e IMO correcta, ya que no manipula el estado interno del objeto) es buscar el archivo de nuevo al principio y crear una nueva instancia DictReader para el segundo bucle.

0
GPhilo 9 oct. 2019 a las 08:27

Para restablecer al inicio de un archivo intente esto:

>>> csvFile.seek(0)

El método de archivo Python seek () establece la posición actual del archivo en el desplazamiento

0
Maciej M 3 oct. 2019 a las 13:05
58219540