Lire le fichier de la ligne 2 ou ignorer la ligne d'en-tête


242

Comment puis-je ignorer la ligne d'en-tête et commencer à lire un fichier à partir de la ligne2?

Réponses:


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

52
si vous avez besoin de l'en-tête plus tard, au lieu de l' next(f)utiliser f.readline()et de le stocker en tant que variable
damné

37
Ou utilisez header_line = next(f).
Samuel

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

Cela sautera 1 ligne. ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil

3
@LjubisaLivac a raison - cette réponse se généralise à n'importe quelle ligne, c'est donc une solution beaucoup plus puissante.
Daniel Soutar

17
C'est très bien jusqu'à ce que le fichier soit trop volumineux pour être lu. C'est très bien pour les petits fichiers.
CppLearner

1
La tranche crée également une copie du contenu. C'est juste inutilement inefficace.
chepner

Qu'en est-il de l'utilisation consume()de more-itertoolscomme indiqué dans docs.python.org/3/library/itertools.html#itertools-recipes ? J'en ai entendu parler sur stackoverflow.com/questions/11113803
AnotherParker

24

Si vous voulez la première ligne et que vous souhaitez effectuer une opération sur le fichier, ce code vous sera utile.

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

Il n'est pas nécessaire d'affecter readline () à une variable si l'on n'a pas besoin de cette ligne. Cependant, j'aime le plus cette solution.
Anna

Il n'est pas recommandé de mélanger les lectures directes avec l'utilisation du fichier en tant qu'itérateur (bien que dans ce cas spécifique aucun dommage ne soit fait).
chepner

9

Si le découpage pouvait fonctionner sur les itérateurs ...

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

1
C'est une façon vraiment agréable et pythonique de résoudre le problème et peut être étendue à un nombre arbitraire de lignes d'en-tête
Dai

C'est une très belle exécution!
Diesel

Solution merveilleuse
Russ Hyde

Cela devrait être beaucoup plus voté, bien plus qu'il ne l'est actuellement.
chepner

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

2
Cela lira le fichier entier en mémoire à la fois, donc ce n'est pratique que si vous lisez un fichier assez petit.
Hayden Schiff

1

Pour généraliser la tâche de lecture de plusieurs lignes d'en-tête et pour améliorer la lisibilité, j'utiliserais l'extraction de méthode. Supposons que vous vouliez symboliser les trois premières lignes decoordinates.txt pour utiliser comme informations d'en-tête.

Exemple

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

Ensuite, l'extraction de méthode vous permet de spécifier ce que vous voulez faire avec les informations d'en-tête (dans cet exemple, nous jetons simplement les lignes d'en-tête en fonction de la virgule et les renvoyons sous forme de liste, mais il y a de la place pour faire beaucoup plus).

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

Production

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

Si coordinates.txtcontient une autre ligne d'en-tête, changez simplement numberheaderlines. Le meilleur de tous, c'est clair ce qui __readheader(rh, numberheaderlines=2)se passe et nous évitons l'ambiguïté d'avoir à comprendre ou commenter pourquoi l'auteur de la réponse acceptée utilise next()dans son code.


1

Si vous souhaitez lire plusieurs fichiers CSV à partir de la ligne 2, cela fonctionne comme un charme

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

(cela fait partie de la réponse de Parfait à une autre question)


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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.