Odczytaj plik z wiersza 2 lub pomiń wiersz nagłówka

242

Jak mogę pominąć wiersz nagłówka i rozpocząć czytanie pliku z wiersza 2?

super9
źródło

Odpowiedzi:

453
with open(fname) as f:
    next(f)
    for line in f:
        #do something
SilentGhost
źródło
51
jeśli potrzebujesz później nagłówka, zamiast go next(f)używać f.readline()i przechowywać jako zmienną
cholera
36
Lub użyj header_line = next(f).
Samuel
94
f = open(fname,'r')
lines = f.readlines()[1:]
f.close()
Chrisrisley
źródło
Pominie to 1 linię. ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil
3
@LjubisaLivac ma rację - ta odpowiedź uogólnia się na każdą linię, więc jest to o wiele potężniejsze rozwiązanie.
Daniel Soutar,
17
Jest w porządku, dopóki plik nie jest zbyt duży, aby go odczytać. To jest dobre w przypadku małych plików.
CppLearner
1
Plasterek tworzy również kopię zawartości. Jest to po prostu niepotrzebnie nieefektywne.
chepner
A co consume()z używaniem z, more-itertoolsjak stwierdzono w docs.python.org/3/library/itertools.html#itertools-recipes ? Słyszałem o tym na stackoverflow.com/questions/11113803
AnotherParker
24

Jeśli potrzebujesz pierwszej linii, a następnie chcesz wykonać operację na pliku, ten kod będzie pomocny.

with open(filename , 'r') as f:
    first_line = f.readline()
    for line in f:
            # Perform some operations
saimadhu.polamuri
źródło
Nie jest konieczne przypisywanie readline () do zmiennej, jeśli nie jest potrzebna ta linia. Najbardziej podoba mi się to rozwiązanie.
Anna
Nie zaleca się mieszania bezpośrednich odczytów z użyciem pliku jako iteratora (chociaż w tym konkretnym przypadku nie wyrządza się szkody).
chepner
9

Jeśli krojenie może działać na iteratorach ...

from itertools import islice
with open(fname) as f:
    for line in islice(f, 1, None):
        pass
Vajk Hermecz
źródło
1
Jest to naprawdę fajny i pytonowy sposób rozwiązania problemu i można go rozszerzyć na dowolną liczbę wierszy nagłówka
Dai
To naprawdę miłe wykonanie!
Olej napędowy
Cudowne rozwiązanie
Russ Hyde
Należy to ocenić znacznie, znacznie bardziej niż obecnie.
chepner
8
f = open(fname).readlines()
firstLine = f.pop(0) #removes the first line
for line in f:
    ...
Dror Hilman
źródło
2
Spowoduje to odczytanie całego pliku na raz, więc jest to praktyczne tylko wtedy, gdy czytasz dość mały plik.
Hayden Schiff,
1

Aby uogólnić zadanie odczytu wielu linii nagłówka i poprawić czytelność, użyłbym metody ekstrakcji. Załóżmy, że chcesz tokenizować trzy pierwsze wiersze w coordinates.txtcelu użycia jako informacji nagłówka.

Przykład

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

Następnie wyodrębnianie metody pozwala określić, co chcesz zrobić z informacjami nagłówka (w tym przykładzie po prostu tokenizujemy linie nagłówka na podstawie przecinka i zwracamy go jako listę, ale jest miejsce na wiele więcej).

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

Wynik

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

Jeśli coordinates.txtzawiera inny nagłówek, po prostu zmień numberheaderlines. Co najlepsze, jasne __readheader(rh, numberheaderlines=2)jest, co się dzieje, i unikamy dwuznaczności, że musimy wymyślić lub skomentować, dlaczego autor akceptowanej odpowiedzi używa next()w swoim kodzie.

Minh Tran
źródło
1

Jeśli chcesz odczytać wiele plików CSV, zaczynając od linii 2, działa to jak urok

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

(jest to część odpowiedzi Parfait na inne pytanie)

Tiago Martins Peres 李大仁
źródło
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)
Mauro Rementeria
źródło