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




scipy plot csv (8)

Wenn es ein Tisch ist.

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

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.


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


Diese Lösung hat mir dabei geholfen, die durch die linetostart Variable angegebene Anzahl von Zeilen zu überspringen. Sie erhalten den Index (int) und die Zeile (String), wenn Sie auch diese verfolgen möchten. In Ihrem Fall ersetzen Sie Linetostart durch 18 oder weisen der Linetostart-Variablen 18 zu.

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

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 (jedoch nicht voneinander abhängig sind).


Sie können ein List-Comprehension verwenden, um daraus einen Einzeiler zu machen:

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

Weitere Informationen zum Listenverständnis in PEP 202 und in der Python-Dokumentation .


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

Mit next(iterator) 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)

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

Hier sind die Timeit-Ergebnisse für die ersten beiden Antworten. Beachten Sie, dass "file.txt" eine Textdatei ist, die 100.000 Zeilen zufälliger Zeichenfolgen 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.





skip