131 votes

Comment ignorer la première ligne de données lors du traitement de données CSV ?

Je demande à Python d'imprimer le nombre minimum d'une colonne de données CSV, mais la première ligne est le numéro de la colonne, et je ne veux pas que Python prenne en compte la première ligne. Comment puis-je faire en sorte que Python ignore la première ligne ?

Voici le code jusqu'à présent :

import csv

with open('all16.csv', 'rb') as inf:
    incsv = csv.reader(inf)
    column = 1                
    datatype = float          
    data = (datatype(column) for row in incsv)   
    least_value = min(data)

print least_value

Pourriez-vous également expliquer ce que vous faites, et pas seulement donner le code ? Je suis très novice en Python et je voudrais être sûr de tout comprendre.

116voto

martineau Points 21665

Vous pouvez utiliser une instance de la csv du module Sniffer pour déduire le format d'un fichier CSV et détecter si une ligne d'en-tête est présente, ainsi que la classe intégrée next() pour ne sauter la première ligne que lorsque cela est nécessaire :

import csv

with open('all16.csv', 'r', newline='') as file:
    has_header = csv.Sniffer().has_header(file.read(1024))
    file.seek(0)  # Rewind.
    reader = csv.reader(file)
    if has_header:
        next(reader)  # Skip header row.
    column = 1
    datatype = float
    data = (datatype(row[column]) for row in reader)
    least_value = min(data)

print(least_value)

Depuis datatype y column sont codées en dur dans votre exemple, il serait un peu plus rapide de traiter le fichier row comme ça :

    data = (float(row[1]) for row in reader)

Nota: le code ci-dessus est pour Python 3.x. Pour Python 2.x, utilisez la ligne suivante pour ouvrir le fichier au lieu de ce qui est indiqué :

with open('all16.csv', 'rb') as file:

85voto

J.F. Sebastian Points 102961

Pour sauter la première ligne, il suffit d'appeler :

next(inf)

Les fichiers en Python sont des itérateurs sur les lignes.

37voto

shin Points 521

Emprunté auprès de livre de cuisine python ,
Un code de modèle plus concis pourrait ressembler à ceci :

import csv
with open('stocks.csv') as f:
    f_csv = csv.reader(f) 
    headers = next(f_csv) 
    for row in f_csv:
        # Process row ...

25voto

Maarten Points 411

Dans un cas similaire, j'ai dû sauter des lignes ennuyeuses avant la ligne contenant les noms de mes colonnes. Cette solution a bien fonctionné. Lire le fichier d'abord, puis passer la liste à csv.DictReader .

with open('all16.csv') as tmp:
    # Skip first line (if any)
    next(tmp, None)

    # {line_num: row}
    data = dict(enumerate(csv.DictReader(tmp)))

19voto

Jon Clements Points 51556

Vous utiliseriez normalement next(incsv) qui fait avancer l'itérateur d'une ligne, donc on saute l'en-tête. L'autre (disons que vous voulez sauter 30 lignes) serait :

from itertools import islice
for row in islice(incsv, 30, None):
    # process

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X