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.
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)
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'])
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.