268 votes

Sauter les en-têtes lors de l'édition d'un fichier csv avec Python

J'utilise le code ci-dessous pour éditer un csv en utilisant Python. Les fonctions appelées dans le code constituent la partie supérieure du code.

Problème : Je veux que le code ci-dessous commence à éditer le csv à partir de la 2ème ligne, je veux qu'il exclue la 1ère ligne qui contient les en-têtes. Pour l'instant, il applique les fonctions à la 1ère ligne uniquement et ma ligne d'en-tête est modifiée.

in_file = open("tmob_notcleaned.csv", "rb")
reader = csv.reader(in_file)
out_file = open("tmob_cleaned.csv", "wb")
writer = csv.writer(out_file)
row = 1
for row in reader:
    row[13] = handle_color(row[10])[1].replace(" - ","").strip()
    row[10] = handle_color(row[10])[0].replace("-","").replace("(","").replace(")","").strip()
    row[14] = handle_gb(row[10])[1].replace("-","").replace(" ","").replace("GB","").strip()
    row[10] = handle_gb(row[10])[0].strip()
    row[9] = handle_oem(row[10])[1].replace("Blackberry","RIM").replace("TMobile","T-Mobile").strip()
    row[15] = handle_addon(row[10])[1].strip()
    row[10] = handle_addon(row[10])[0].replace(" by","").replace("FREE","").strip()
    writer.writerow(row)
in_file.close()    
out_file.close()

J'ai essayé de résoudre ce problème en initialisant row à la variable 1 mais cela n'a pas fonctionné.

Veuillez m'aider à résoudre ce problème.

459voto

Martijn Pieters Points 271458

Votre reader est une variable itérable, en la parcourant en boucle, vous récupérez les lignes.

Pour faire sauter un élément avant votre boucle, il suffit d'appeler next(reader, None) et ignorer la valeur de retour.

Vous pouvez également simplifier un peu votre code ; utilisez les fichiers ouverts comme gestionnaires de contexte pour les fermer automatiquement :

with open("tmob_notcleaned.csv", "rb") as infile, open("tmob_cleaned.csv", "wb") as outfile:
   reader = csv.reader(infile)
   next(reader, None)  # skip the headers
   writer = csv.writer(outfile)
   for row in reader:
       # process each row
       writer.writerow(row)

# no need to close, the files are closed automatically when you get to this point.

Si vous voulez écrire l'en-tête dans le fichier de sortie sans traitement, c'est facile aussi, passez la sortie de next() a writer.writerow() :

headers = next(reader, None)  # returns the headers or `None` if the input is empty
if headers:
    writer.writerow(headers)

152voto

Une autre façon de résoudre ce problème est d'utiliser la classe DictReader, qui "saute" la ligne d'en-tête et l'utilise pour permettre l'indexation nommée.

Étant donné "foo.csv" comme suit :

FirstColumn,SecondColumn
asdf,1234
qwer,5678

Utilisez DictReader comme suit :

import csv
with open('foo.csv') as f:
    reader = csv.DictReader(f, delimiter=',')
    for row in reader:
        print(row['FirstColumn'])  # Access by column header instead of column number
        print(row['SecondColumn'])

10voto

katrielalex Points 40655

Faire row=1 ne changera rien, car vous l'écraserez simplement avec les résultats de la boucle.

Vous voulez faire next(reader) pour sauter une ligne.

3voto

xatz3npki Points 129

Il suffit d'itérer une fois avec next()

with open(filename) as file:

    csvreaded = csv.reader(file)
    header = next(csvreaded)

    for row in csvreaded:
        empty_list.append(row) #your csv list without header  

ou utiliser [1 :] à la fin de l'objet lecteur

with open(filename) as file:

    csvreaded = csv.reader(file)
    header = next(csvreaded)

    for row in csvreaded[1:]:
        empty_list.append(row) #your csv list without header

0voto

Inspiré par la réponse de Martijn Pieters.

Si vous avez seulement besoin de supprimer l'en-tête du fichier csv vous pouvez travailler plus efficacement si vous écrivez en utilisant la bibliothèque d'E/S de fichiers standard de Python, en évitant d'écrire avec la bibliothèque CSV de Python :

with open("tmob_notcleaned.csv", "rb") as infile, open("tmob_cleaned.csv", "wb") as outfile:
   next(infile)  # skip the headers
   outfile.write(infile.read())

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