Edit:
Dans 2.7 / 3.2 il y a une nouvelle writeheader()
méthode . De plus, la réponse de John Machin fournit une méthode plus simple pour écrire la ligne d'en-tête.
Exemple simple d'utilisation de la writeheader()
méthode désormais disponible en 2.7 / 3.2:
from collections import OrderedDict
ordered_fieldnames = OrderedDict([('field1',None),('field2',None)])
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=ordered_fieldnames)
dw.writeheader()
# continue on to write data
L'instanciation de DictWriter nécessite un argument fieldnames.
De la documentation :
Le paramètre fieldnames identifie l'ordre dans lequel les valeurs du dictionnaire passées à la méthode writerow () sont écrites dans le fichier csv.
En d'autres termes: l'argument Fieldnames est obligatoire car les dictionnaires Python ne sont pas ordonnés par nature.
Voici un exemple de la façon dont vous écrivez l'en-tête et les données dans un fichier.
Remarque: une with
déclaration a été ajoutée en 2.6. Si vous utilisez 2.5:from __future__ import with_statement
with open(infile,'rb') as fin:
dr = csv.DictReader(fin, delimiter='\t')
# dr.fieldnames contains values from first row of `f`.
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
headers = {}
for n in dw.fieldnames:
headers[n] = n
dw.writerow(headers)
for row in dr:
dw.writerow(row)
Comme @FM le mentionne dans un commentaire, vous pouvez condenser l'écriture d'en-tête en une seule ligne, par exemple:
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
dw.writerow(dict((fn,fn) for fn in dr.fieldnames))
for row in dr:
dw.writerow(row)
dw.writerow( dict((f,f) for f in dr.fieldnames) )
.dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
. De cette façon, si vos champs changent, vous n'avez pas besoin d'ajuster le dictWriter.Quelques options:
(1) Faites laborieusement un mappage d'identité (c'est-à-dire ne rien faire) de vos noms de champ afin que csv.DictWriter puisse le reconvertir en liste et le transmettre à une instance de csv.writer.
(2) La documentation mentionne "l'
writer
instance sous-jacente " ... alors utilisez-la simplement (exemple à la fin).(3) Évitez la surcharge de csv.Dictwriter et faites-le vous-même avec csv.writer
Écriture des données:
ou
Au lieu de la
extrasaction
«fonctionnalité», je préfère la coder moi-même; de cette façon, vous pouvez signaler TOUS les "extras" avec les clés et les valeurs, pas seulement la première clé supplémentaire. Ce qui est vraiment gênant avec DictWriter, c'est que si vous avez vérifié vous-même les clés lors de la construction de chaque dict, vous devez vous rappeler d'utiliser extrasaction = 'ignore', sinon il va répéter LENTEMENT (les noms de champ est une liste) la vérification:============
la source
extrasaction
fonctionnalité semble mieux implémentée. C'est maintenant l'wrong_fields = rowdict.keys() - self.fieldnames so it's effectively a
opération définie.Une autre façon de faire cela serait d'ajouter avant d'ajouter des lignes dans votre sortie, la ligne suivante:
Le zip renverrait une liste de doublets contenant la même valeur. Cette liste peut être utilisée pour lancer un dictionnaire.
la source