Problèmes DictReader / Writer Python CSV
Question
J'essaie d'extraire une série de lignes d'un fichier CSV et de les écrire dans un autre, mais j'ai des problèmes.
import csv
f = open("my_csv_file.csv", "r")
r = csv.DictReader(f, delimiter=',')
fieldnames = r.fieldnames
target = open("united.csv", 'w')
w = csv.DictWriter(united, fieldnames=fieldnames)
while True:
try:
row = r.next()
if r.line_num <= 2: #first two rows don't matter
continue
else:
w.writerow(row)
except StopIteration:
break
f.close()
target.close()
En cours d'exécution, j'obtiens le message d'erreur suivant:
Traceback (most recent call last):
File "unify.py", line 16, in <module>
w.writerow(row)
File "C:\Program Files\Python25\lib\csv.py", line 12
return self.writer.writerow(self._dict_to_list(row
File "C:\Program Files\Python25\lib\csv.py", line 12
if k not in self.fieldnames:
TypeError: argument of type 'NoneType' is not iterable
Je ne suis pas tout à fait sûr de ce que je ne me trompe pas.
La solution
Je ne le sais pas non plus, mais comme vous ne faites que copier des lignes d'un fichier à un autre, pourquoi vous ennuyez-vous avec le contenu csv
? Pourquoi pas quelque chose comme:
f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')
f.readline()
f.readline()
for line in f:
target.write(line)
Autres conseils
Pour dissiper toute confusion concernant l'erreur: vous l'obtenez parce que r.nom de champs
n'est défini que lorsque vous lisez pour la première fois dans le fichier d'entrée à l'aide de r
. Par conséquent, comme vous l'avez écrit, les noms de champs
seront toujours initialisés à Aucun
.
Vous pouvez initialiser w = csv.DictWriter (united, noms de champs = noms de champs)
avec r.noms de champs
uniquement après avoir lu la première ligne de r
, ce qui signifie que vous devrez restructurer votre code.
Ce comportement est documenté dans la documentation sur la bibliothèque standard Python .
Les objets DictReader ont l'attribut public suivant:
csvreader.fieldnames
S'il n'est pas passé en tant que paramètre lors de la création de l'objet, cet attribut est initialisé lors du premier accès ou lors de la lecture du premier enregistrement à partir du fichier.
Comme pour l’exception, ressemble à cette ligne:
w = csv.DictWriter(united, fieldnames=fieldnames)
devrait être
w = csv.DictWriter(target, fieldnames=fieldnames)
Si vous obtenez l'erreur, c'est probablement que votre fichier CSV d'origine (my_csv_file.csv) ne comporte pas de ligne d'en-tête. Par conséquent, lorsque vous construisez l'objet lecteur, son champ fieldnames est défini sur None
.
Lorsque vous essayez d'écrire une ligne à l'aide de l'enregistreur, celui-ci vérifie d'abord que le dictionnaire n'a pas de clé qui ne figure pas dans la liste des champs connus. Puisque noms de champs
est défini sur Aucun
, une tentative de déréférence du nom de clé lève une exception.