2010-07-08 27 views
9

escribí una función que serializa una lista de diccionarios como un archivo CSV con el módulo csv, con código como el siguiente:Usando DictWriter escribir un subconjunto de claves de un diccionario

data = csv.DictWriter(out_f, fieldnames) 
data.writerows(dictrows) 

Sin embargo, a veces me quiero escriba en un archivo solo un subconjunto de las claves de cada diccionario. Si paso como fieldnames un subconjunto de las claves que cada diccionario, me sale el error:

"dict contains fields not in fieldnames" 

¿Cómo puedo hacer para que DictRows escribirán sólo un subconjunto de los campos que especifico a CSV, haciendo caso omiso de los campos que están en el diccionario pero no en los nombres de campo?

Respuesta

33

más sencillo y directo enfoque es pasar extrasaction='ignore' al inicializar la instancia DictWriter, tal como se documenta here:

If the dictionary passed to the writerow() method contains a key not found in fieldnames, the optional extrasaction parameter indicates what action to take. If it is set to 'raise' a ValueError is raised. If it is set to 'ignore' , extra values in the dictionary are ignored.

También trabaja en writerows, que, internamente, sólo llama writerow repetidamente.

+1

La opción restval para la clave del diccionario no encontrado es particularmente útil junto con extrasaction = 'ignore'. – Gregor

1

cambios en su código:

olvidan Dictwriter, utilizan escritor ordinaria.

Entonces bucle sobre su lista de dicts:

for d in dictrows: 
    ordinary_writer.writerow([d[fieldname] for fieldname in fieldnames]) 

Uso d.get(fieldname, "") en lugar de d[fieldname] si no quieren una excepción si no hay ninguna entrada en d para un fieldname.

Nota para downvoters anónimos: Esto es hacer lo que la solución de Alex está haciendo bajo el capó (ver Lib/csv.py) y hacerlo un poco mejor ... csv.py llama a una función para obtener cada fila en una lista , y las agallas de esa función es

return [rowdict.get(key, self.restval) for key in self.fieldnames] 
+0

-1; no hay razón para hacer esto cuando 'DictWriter' proporciona un parámetro conveniente para resolver el problema automáticamente, como se describe en la respuesta de Alex. –

Cuestiones relacionadas