2009-07-29 7 views
3

J'essaie d'extraire un tas de lignes à partir d'un fichier CSV et de les écrire dans un autre, mais j'ai quelques problèmes.Python CSV DictReader/Writer questions

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() 

L'exécution de cette, je reçois l'erreur suivante:

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 

Pas tout à fait sûr de ce que je suis dong mal.

Répondre

13

Je ne sais pas non plus, mais puisque tout ce que vous faites est de copier des lignes d'un fichier à l'autre, pourquoi vous ennuyez-vous avec les choses csv? Pourquoi ne 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) 
+0

brillant. J'ai tendance à trop compliquer les choses. Merci. – saturdayplace

+0

Cette réponse est brillante, car elle résout le problème sous-jacent;) – Jaykul

1

Quant à l'exception, ressemble à cette ligne:

w = csv.DictWriter(united, fieldnames=fieldnames) 

devrait être

w = csv.DictWriter(target, fieldnames=fieldnames) 
1

La raison pour laquelle vous obtenez l'erreur est plus probable que votre fichier CSV d'origine (my_csv_file.csv) n'a 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'éditeur, il vérifie d'abord qu'il n'y a aucune clé dans la dict qui ne figure pas dans sa liste de champs connus. Puisque fieldnames est défini sur None, une tentative de déréférencement du nom de clé déclenche une exception.

13

Pour dissiper la confusion sur l'erreur: vous l'obtenez parce que r.fieldnames n'est défini que lorsque vous avez lu le fichier d'entrée pour la première fois en utilisant r. Par conséquent, comme vous l'avez écrit, fieldnames sera toujours initialisé à None.

Vous pouvez initialiser w = csv.DictWriter(united, fieldnames=fieldnames) avec r.fieldnames 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 le Python Standard Library documentation

DictReader objects have the following public attribute:

csvreader.fieldnames

If not passed as a parameter when creating the object, this attribute is initialized upon first access or when the first record is read from the file.

+1

Cette réponse est géniale car elle résout l'erreur ... – Jaykul