Lesen Sie die Datei aus Zeile 2 oder überspringen Sie die Kopfzeile


242

Wie kann ich die Kopfzeile überspringen und eine Datei aus Zeile 2 lesen?

Antworten:


453
with open(fname) as f:
    next(f)
    for line in f:
        #do something

51
Wenn Sie den Header später benötigen, anstatt ihn als Variable zu next(f)verwenden f.readline()und zu speichern
verdammt

36
Oder verwenden header_line = next(f).
Samuel

94
f = open(fname,'r')
lines = f.readlines()[1:]
f.close()

Dadurch wird 1 Zeile übersprungen. ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil

3
@LjubisaLivac ist richtig - diese Antwort verallgemeinert sich auf jede Zeile, daher ist dies eine viel leistungsfähigere Lösung.
Daniel Soutar

17
Dies ist in Ordnung, bis die Datei zu groß zum Lesen ist. Dies ist gut für kleine Dateien.
CppLearner

1
Das Slice erstellt auch eine Kopie des Inhalts. Dies ist nur unnötig ineffizient.
Chepner

Was ist mit der Verwendung consume()von more-itertoolswie in docs.python.org/3/library/itertools.html#itertools-recipes angegeben ? Ich habe davon auf stackoverflow.com/questions/11113803
AnotherParker

24

Wenn Sie die erste Zeile und dann eine Operation für die Datei ausführen möchten, ist dieser Code hilfreich.

with open(filename , 'r') as f:
    first_line = f.readline()
    for line in f:
            # Perform some operations

Es ist nicht erforderlich, einer Variablen readline () zuzuweisen, wenn diese Zeile nicht benötigt wird. Diese Lösung gefällt mir jedoch am besten.
Anna

Das Mischen von direkten Lesevorgängen mit der Verwendung der Datei als Iterator wird nicht empfohlen (obwohl in diesem speziellen Fall kein Schaden angerichtet wird).
Chepner

9

Wenn das Schneiden auf Iteratoren funktionieren könnte ...

from itertools import islice
with open(fname) as f:
    for line in islice(f, 1, None):
        pass

1
Dies ist eine wirklich schöne und pythonische Art, das Problem zu lösen und kann auf eine beliebige Anzahl von Kopfzeilen erweitert werden
Dai

Das ist eine wirklich schöne Ausführung!
Diesel

Wunderbare Lösung
Russ Hyde

Dies sollte viel, viel mehr als derzeit positiv bewertet werden.
Chepner

8
f = open(fname).readlines()
firstLine = f.pop(0) #removes the first line
for line in f:
    ...

2
Dadurch wird die gesamte Datei auf einmal in den Speicher eingelesen. Daher ist es nur praktisch, wenn Sie eine relativ kleine Datei lesen.
Hayden Schiff

1

Um die Aufgabe des Lesens mehrerer Kopfzeilen zu verallgemeinern und die Lesbarkeit zu verbessern, würde ich die Methodenextraktion verwenden. Angenommen, Sie möchten die ersten drei Zeilen tokenisieren, die coordinates.txtals Header-Informationen verwendet werden sollen.

Beispiel

coordinates.txt
---------------
Name,Longitude,Latitude,Elevation, Comments
String, Decimal Deg., Decimal Deg., Meters, String
Euler's Town,7.58857,47.559537,0, "Blah"
Faneuil Hall,-71.054773,42.360217,0
Yellowstone National Park,-110.588455,44.427963,0

Mit der Methodenextraktion können Sie dann angeben, was Sie mit den Header-Informationen tun möchten (in diesem Beispiel werden die Header-Zeilen einfach anhand des Kommas markiert und als Liste zurückgegeben, aber es gibt noch viel mehr zu tun).

def __readheader(filehandle, numberheaderlines=1):
    """Reads the specified number of lines and returns the comma-delimited 
    strings on each line as a list"""
    for _ in range(numberheaderlines):
        yield map(str.strip, filehandle.readline().strip().split(','))

with open('coordinates.txt', 'r') as rh:
    # Single header line
    #print next(__readheader(rh))

    # Multiple header lines
    for headerline in __readheader(rh, numberheaderlines=2):
        print headerline  # Or do other stuff with headerline tokens

Ausgabe

['Name', 'Longitude', 'Latitude', 'Elevation', 'Comments']
['String', 'Decimal Deg.', 'Decimal Deg.', 'Meters', 'String']

Wenn coordinates.txteine andere Kopfzeile enthalten ist, ändern Sie einfach numberheaderlines. Das Beste ist, es ist klar, was zu __readheader(rh, numberheaderlines=2)tun ist, und wir vermeiden die Mehrdeutigkeit, herausfinden oder kommentieren zu müssen, warum der Autor der akzeptierten Antwort next()in seinem Code verwendet.


1

Wenn Sie mehrere CSV-Dateien ab Zeile 2 lesen möchten, funktioniert dies wie ein Zauber

for files in csv_file_list:
        with open(files, 'r') as r: 
            next(r)                  #skip headers             
            rr = csv.reader(r)
            for row in rr:
                #do something

(Dies ist Teil von Parfaits Antwort auf eine andere Frage.)


0
# Open a connection to the file
with open('world_dev_ind.csv') as file:

    # Skip the column names
    file.readline()

    # Initialize an empty dictionary: counts_dict
    counts_dict = {}

    # Process only the first 1000 rows
    for j in range(0, 1000):

        # Split the current line into a list: line
        line = file.readline().split(',')

        # Get the value for the first column: first_col
        first_col = line[0]

        # If the column value is in the dict, increment its value
        if first_col in counts_dict.keys():
            counts_dict[first_col] += 1

        # Else, add to the dict and set value to 1
        else:
            counts_dict[first_col] = 1

# Print the resulting dictionary
print(counts_dict)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.