web-dev-qa-db-fra.com

Ignore les en-têtes lors de la modification 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 mentionné ci-dessous commence à éditer le fichier csv à partir de la 2e ligne, je veux qu’il exclue la première ligne contenant des en-têtes. Actuellement, il applique les fonctions sur 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 la variable row à 1 mais cela n'a pas fonctionné.

Aidez-moi s'il vous plaît à résoudre ce problème.

178
user1915050

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

Pour le faire sauter un élément avant votre boucle, appelez simplement next(reader, None) et ignorez la valeur de retour.

Vous pouvez également simplifier un peu votre code; utilisez les fichiers ouverts en tant que 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, rien de plus simple, transmettez la sortie de next() à writer.writerow():

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

Une autre solution consiste à utiliser la classe DictReader, qui "ignore" la ligne d'en-tête et l'utilise pour autoriser l'indexation nommée.

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

FirstColumn,SecondColumn
asdf,1234
qwer,5678

Utilisez DictReader comme ceci:

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'])
103
Chad Zawistowski

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

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

6
Katriel