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.