Leggi il file dalla riga 2 o salta la riga dell'intestazione


242

Come posso saltare la riga di intestazione e iniziare a leggere un file da line2?

Risposte:


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

52
se hai bisogno dell'intestazione in un secondo momento, invece di next(f)usarla f.readline()e archiviarla come variabile
dannatamente l'

37
Oppure usa header_line = next(f).
Samuel,

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

Questo salterà 1 riga. ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil il

3
@LjubisaLivac ha ragione: questa risposta generalizza qualsiasi linea, quindi questa è una soluzione molto più potente.
Daniel Soutar,

17
Questo va bene FINO A quando il file è troppo grande per essere letto. Questo va bene per file di piccole dimensioni.
CppLearner,

1
La sezione crea anche una copia del contenuto. Questo è inutilmente inutile.
Chepner,

Cosa succede ad usare consume()da more-itertoolscome indicato in docs.python.org/3/library/itertools.html#itertools-recipes ? Ho sentito parlare di questo su stackoverflow.com/questions/11113803
AnotherParker

24

Se si desidera la prima riga e si desidera eseguire alcune operazioni sul file, questo codice sarà utile.

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

Non è necessario assegnare readline () a una variabile se non è necessaria questa riga. Mi piace di più questa soluzione, tuttavia.
Anna,

Non è consigliabile mescolare letture dirette con l'utilizzo del file come iteratore (anche se in questo caso specifico non viene fatto alcun danno).
Chepner,

9

Se l'affettare potrebbe funzionare su iteratori ...

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

1
Questo è un modo davvero piacevole e pitonico per risolvere il problema e può essere esteso a un numero arbitrario di righe di intestazione
Dai

Questa è davvero una bella esecuzione!
Diesel

Soluzione meravigliosa
Russ Hyde,

Questo dovrebbe essere votato molto, molto più di quello che è attualmente.
Chepner,

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

2
Questo leggerà l'intero file in memoria contemporaneamente, quindi è pratico solo se stai leggendo un file abbastanza piccolo.
Hayden Schiff il

1

Per generalizzare il compito di leggere più righe di intestazione e migliorare la leggibilità, utilizzerei l'estrazione del metodo. Supponiamo di voler tokenizzare le prime tre righe coordinates.txtda utilizzare come informazioni di intestazione.

Esempio

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

Quindi l'estrazione del metodo ti consente di specificare cosa vuoi fare con le informazioni di intestazione (in questo esempio tokenizziamo semplicemente le linee di intestazione in base alla virgola e le restituiamo come un elenco ma c'è spazio per fare molto di più).

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

Produzione

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

Se coordinates.txtcontiene un altro titolo, cambia semplicemente numberheaderlines. Soprattutto, è chiaro cosa __readheader(rh, numberheaderlines=2)sta facendo ed evitiamo l'ambiguità di dover capire o commentare perché l'autore della risposta accettata utilizza next()nel suo codice.


1

Se vuoi leggere più file CSV a partire dalla riga 2, questo funziona come un incantesimo

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

(fa parte della risposta del Parfait a una domanda diversa)


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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.