J'utilise ci-dessous le code référencé pour modifier un csv en utilisant Python. Les fonctions appelées dans le code forment la partie supérieure du code.
Problème: je veux que le code référencé ci-dessous commence à éditer le csv de la 2ème ligne, je veux qu'il exclue la 1ère ligne qui contient des en-têtes. En ce moment, 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 row
variable à 1
mais cela n'a pas fonctionné.
Veuillez m'aider à résoudre ce problème.
python
python-2.7
csv
Martijn Pieters
la source
la source
Réponses:
Votre
reader
variable est un itérable, en bouclant dessus vous récupérez les lignes.Pour lui faire sauter un élément avant votre boucle, il suffit d'appeler
next(reader, None)
et d'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:
Si vous vouliez écrire l'en-tête dans le fichier de sortie non traité, c'est aussi facile, passez la sortie de
next()
àwriter.writerow()
:la source
for row in islice(reader, 1, None)
- bien que moins explicite quenext
pour la plupart des travaux simples "sauter une ligne", pour sauter plusieurs lignes d'en-tête (ou obtenir seulement certains morceaux, etc.), c'est assez pratiquetry: writer.write(next(reader))... except StopIteration: # handle empty reader
try:
/except:
.next
itération explicite est qu'il est "gratuit";islice
envelopperait l'reader
ajout permanent (une quantité certes très faible) de frais généraux à chaque itération. Laconsume
recette deitertools
peut être utilisée pour ignorer de nombreuses valeurs rapidement, sans ajouter d'habillage à une utilisation ultérieure, dans le cas où leislice
aurait unstart
mais nonend
, de sorte que la surcharge ne vous rapporte rien.Une autre façon de résoudre ce problème consiste à utiliser la classe DictReader, qui «saute» la ligne d'en-tête et l'utilise pour autoriser l'indexation nommée.
Étant donné "foo.csv" comme suit:
Utilisez DictReader comme ceci:
la source
If the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames.
Voir docs.python.org/2/library/csv.htmlFaire
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.la source
for row in next(reader):
mais cela me donne uneIndexError: string index out of range
erreurnext(reader); for row in reader:
....