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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top