2009-09-30 12 views
9

A menudo necesito procesar archivos de texto grandes que contengan encabezados en la primera línea. Los encabezados a menudo se tratan de manera diferente al cuerpo del archivo, o mi procesamiento del cuerpo depende de los encabezados. De cualquier manera, necesito tratar la primera línea como un caso especial. que podría utilizar iteración simple línea y establecer un indicador:¿Cómo tratar la primera línea de un archivo de manera diferente en Python?

headerProcessed = false 
for line in f: 
    if headerProcessed: 
     processBody(line) 
    else: 
     processHeader(line) 
     headerProcessed = true 

pero no me gusta una prueba en el bucle que es redundante para todas menos una de las millones de veces que ejecuta. ¿Hay una mejor manera? ¿Podría tratar la primera línea de manera diferente y luego comenzar la iteración en la segunda línea? ¿Debería molestarme?

Respuesta

15

Usted podría:

processHeader(f.readline()) 
for line in f: 
    processBody(line) 
+3

Gracias Greg. Esto es exactamente lo que esperaría poder hacer pero de alguna manera asumí que la posición del archivo se restablecería al inicio del ciclo for. Lección de Python aprendida: ¡Espere que el método simple funcione! –

+3

Otra lección para aprender: prueba tus suposiciones. Podrías haberlo intentado y descubierto, ¡pero entonces no nos hubiéramos beneficiado de este interesante intercambio! – Todd

+0

Lo anterior funciona pero, en general, puede obtener: 'ValueError: la mezcla de iteración y los métodos de lectura perderían datos'. – jfs

3

Uso iter()

it_f = iter(f) 
header = it_f.next() 
processHeader(header) 

for line in it_f: 
    processBody(line) 

funciona con cualquier objeto iterable.

+3

Creo que "iteratorable" es simplemente adorable. – PaulMcG

+1

Gracias por la corrección: D –

8
f = file("test") 
processHeader(f.next()) #or next(f) for py3 
for line in f: 
    processBody(line) 

Esto funciona.

Editar:

Cambiado .__next__ a next (que son equivalente, pero supongo que después es más concisa).

regaring file vs open, file sólo parece más claro para mí, por lo tanto voy a seguir para preferir antes open.

+2

Para Python 3, diga 'next (f)' – u0b34a0f6ae

+1

Tenga en cuenta que 'open()' es preferible a 'file()', aquí. 'file' se usa mejor como tipo (' isinstance (...) '). – EOL

+0

La versión de Py3 no debe ser 'f .__ next __()' pero 'next (f)' - los métodos de doble guión bajo no deben invocarse directamente. – PaulMcG

2

¿Grandes archivos de texto con encabezados en la primera línea? Entonces son datos tabulares.

Solo para asegurarse: ¿Ha mirado el módulo csv? Debe manejar todos los datos tabulares excepto aquellos en los que los campos no estén delimitados, sino que estén definidos por posición. Y también hace las cosas del encabezado.

+0

Gracias Lennart, sí, con frecuencia uso el excelente módulo csv. –

Cuestiones relacionadas