Salta el primer par de líneas al leer líneas en el archivo de Python

Quiero saltar las primeras 17 líneas mientras leo un archivo de texto.

Digamos que el archivo se ve como:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 good stuff 

Solo quiero las cosas buenas. Lo que estoy haciendo es mucho más complicado, pero esta es la parte con la que estoy teniendo problemas.

Use una rebanada, como a continuación:

 with open('yourfile.txt') as f: lines_after_17 = f.readlines()[17:] 

Si el archivo es demasiado grande para cargar en la memoria:

 with open('yourfile.txt') as f: for _ in range(17): next(f) for line in f: # do stuff 

Use itertools.islice , comenzando en el índice 17. Se omitirán automáticamente las 17 primeras líneas.

 import itertools with open('file.txt') as f: for line in itertools.islice(f, 17, None): # start=17, stop=None # process lines 
 for line in dropwhile(isBadLine, lines): # process as you see fit 

Demostración completa:

 from itertools import * def isBadLine(line): return line=='0' with open(...) as f: for line in dropwhile(isBadLine, f): # process as you see fit 

Ventajas: Esto es fácilmente extensible a los casos en que sus líneas de prefijo son más complicadas que “0” (pero no son interdependientes).

Esta solución me ayudó a omitir la cantidad de líneas especificadas por la variable linetostart . Obtendrá el índice (int) y la línea (cadena) si desea realizar un seguimiento de ellos también. En su caso, sustituya linetostart con 18, o asigne 18 a linetostart variable.

 f = open("file.txt", 'r') for i, line in enumerate(f, linetostart): #Your code 

Aquí hay un método para obtener líneas entre dos números de línea en un archivo:

 import sys def file_line(name,start=1,end=sys.maxint): lc=0 with open(s) as f: for line in f: lc+=1 if lc>=start and lc<=end: yield line s='/usr/share/dict/words' l1=list(file_line(s,235880)) l2=list(file_line(s,1,10)) print l1 print l2 

Salida:

 ['Zyrian\n', 'Zyryan\n', 'zythem\n', 'Zythia\n', 'zythum\n', 'Zyzomys\n', 'Zyzzogeton\n'] ['A\n', 'a\n', 'aa\n', 'aal\n', 'aalii\n', 'aam\n', 'Aani\n', 'aardvark\n', 'aardwolf\n', 'Aaron\n'] 

Simplemente llámelo con un parámetro para obtener de la línea n -> EOF

Si es una mesa.

pd.read_table("path/to/file", sep="\t", index_col=0, skiprows=17)

Si no quieres leer todo el archivo en la memoria de una vez, puedes usar algunos trucos:

Con el next(iterator) puede avanzar a la siguiente línea:

 with open("filename.txt") as f: next(f) next(f) next(f) for line in f: print(f) 

Por supuesto, esto es ligeramente feo, así que itertools tiene una mejor manera de hacer esto:

 from itertools import islice with open("filename.txt") as f: # start at line 17 and never stop (None), until the end for line in islice(f, 17, None): print(f) 

Aquí están los resultados de timeit para las 2 mejores respuestas. Tenga en cuenta que “file.txt” es un archivo de texto que contiene más de 100,000 líneas de cadenas aleatorias con un tamaño de archivo de 1MB +.

Usando itertools:

 import itertools from timeit import timeit timeit("""with open("file.txt", "r") as fo: for line in itertools.islice(fo, 90000, None): line.strip()""", number=100) >>> 1.604976346003241 

Usando dos para bucles:

 from timeit import timeit timeit("""with open("file.txt", "r") as fo: for i in range(90000): next(fo) for j in fo: j.strip()""", number=100) >>> 2.427317383000627 

claramente el método de itertools es más eficiente cuando se trata de archivos grandes.

Puede utilizar una comprensión de lista para convertirla en una sola línea:

 [fl.readline() for i in xrange(17)] 

Más información sobre la comprensión de listas en PEP 202 y en la documentación de Python .