web-dev-qa-db-de.com

Überspringt die ersten Zeilen beim Lesen von Zeilen in der Python-Datei

Ich möchte die ersten 17 Zeilen beim Lesen einer Textdatei überspringen.

Nehmen wir an, die Datei sieht folgendermaßen aus:

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

Ich will nur das gute Zeug. Was ich mache ist viel komplizierter, aber dies ist der Teil, mit dem ich Probleme habe.

43
O.rka

Verwenden Sie eine Scheibe wie unten:

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

Wenn die Datei zu groß ist, um in den Speicher geladen zu werden:

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

Verwenden Sie itertools.islice , beginnend mit Index 17. Die ersten 17 Zeilen werden automatisch übersprungen.

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

Vollständige Demo:

from itertools import *

def isBadLine(line):
    return line=='0'

with open(...) as f:
    for line in dropwhile(isBadLine, f):
        # process as you see fit

Vorteile: Dies ist leicht erweiterbar für Fälle, in denen Ihre Präfixzeilen komplizierter als "0" sind (aber nicht voneinander abhängig sind).

2
ninjagecko

Diese Lösung hat mir dabei geholfen, die Anzahl der Zeilen zu überspringen, die in der Variablen linetostart angegeben sind Ersetzen Sie Linetostart durch 18 oder weisen Sie der Linetostart-Variablen 18 zu.

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

Hier sind die Timeit-Ergebnisse für die ersten beiden Antworten. Beachten Sie, dass "file.txt" eine Textdatei ist, die mehr als 100.000 zufällige Zeilen mit einer Dateigröße von 1 MB + enthält.

Itertools verwenden:

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

Verwenden Sie zwei for-Schleifen:

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

natürlich ist die itertools-Methode bei großen Dateien effizienter.

0
willywonka

Wenn es ein Tisch ist.

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

0
O.rka

Hier ist eine Methode, um Zeilen zwischen zwei Zeilennummern in einer Datei abzurufen:

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

Ausgabe:

['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']

Rufen Sie es einfach mit einem Parameter auf, um von Zeile n -> EOF zu gelangen

0
the wolf

Wenn Sie nicht die gesamte Datei auf einmal in den Speicher lesen möchten, können Sie einige Tricks verwenden:

Mit next(iterator) können Sie zur nächsten Zeile vorrücken:

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

Das ist natürlich etwas hässlich, daher bietet itertools eine bessere Möglichkeit, dies zu tun:

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)
0
Azsgy