Editar:
En 2.7 / 3.2 hay un nuevo writeheader()
método . Además, la respuesta de John Machin proporciona un método más simple para escribir la fila del encabezado.
Ejemplo simple de usar el writeheader()
método ahora 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
La creación de instancias de DictWriter requiere un argumento de nombres de campo.
De la documentación :
El parámetro fieldnames identifica el orden en que los valores del diccionario pasados al método writerow () se escriben en el archivo csv.
Dicho de otra manera: el argumento Nombres de campo es necesario porque los dictados de Python están inherentemente desordenados.
A continuación se muestra un ejemplo de cómo escribiría el encabezado y los datos en un archivo.
Nota: la with
declaración se agregó en 2.6. Si usa 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)
Como @FM menciona en un comentario, puede condensar la escritura del encabezado en una sola línea, por ejemplo:
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 esa manera, si sus campos cambian, no necesita ajustar el dictWriter.Algunas opciones:
(1) Haga laboriosamente un dictado de mapeo de identidad (es decir, no hacer nada) con sus nombres de campo para que csv.DictWriter pueda convertirlo de nuevo en una lista y pasarlo a una instancia de csv.writer.
(2) La documentación menciona "la
writer
instancia subyacente " ... así que úsela (ejemplo al final).(3) Evite la sobrecarga de csv.Dictwriter y hágalo usted mismo con csv.writer
Escribiendo datos:
o
En lugar de la
extrasaction
"funcionalidad", prefiero codificarlo yo mismo; de esa forma puede informar TODOS los "extras" con las claves y valores, no solo la primera clave adicional. Lo que es una verdadera molestia con DictWriter es que si ha verificado las claves usted mismo a medida que se creaba cada dictado, debe recordar usar extrasaction = 'ignore', de lo contrario, va a LENTAMENTE (los nombres de campo son una lista) repita la verificación:============
fuente
extrasaction
funcionalidad parece implementarse mejor. Ahorawrong_fields = rowdict.keys() - self.fieldnames so it's effectively a
es la operación establecida.Otra forma de hacer esto sería agregar antes de agregar líneas en su salida, la siguiente línea:
El zip devolvería una lista de doblete que contiene el mismo valor. Esta lista podría usarse para iniciar un diccionario.
fuente