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
3 respuestas
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.
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.
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
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.