CSV, Python: Usar DictWriter correctamente (ValueError: dict contiene campos que no están en los nombres de campo)

Tengo dificultades para captar el DictWriter en el módulo csv (Python 2.7). Tengo esto (oh, y estoy usando una biblioteca unicodecsv porque he leído que hay problemas):

f = object_instance.return_a_dictionary.keys() with open('eggs.csv', 'wb') as csvfile: spamwriter = unicodecsv.DictWriter(csvfile, fieldnames=f) spamwriter.writerows(object_instance.return_a_dictionary) 

Así que paso en mi instancia de objeto. f es:

 [u'n6s2f0e1', u'n1s0f0e0', u'n2s0f0e1', u'n3s1f0e0', u'n5s2f0e0', u'n4s1f0e1'] 

object_instance.return_a_dictionary es:

 {u'n6s2f0e1': u'stuff', u'n1s0f0e0': u'stuff', u'n2s0f0e1': u'stuff', u'n3s1f0e0': u'stuff', u'n5s2f0e0': u'stuff', u'n4s1f0e1': u'stuff'} 

Así que realmente quiero una primera fila:

 stuff stuff stuff stuff stuff 

Tengo la impresión de que la escritura de escritura pasa por el diccionario proporcionado, llama al nombre de la clave del dictamen proporcionado con los nombres de campo proporcionados por el dictador y genera el valor.

En su lugar me sale:

 Traceback (most recent call last): File "", line 3, in  File "/usr/lib/python2.7/csv.py", line 153, in writerows rows.append(self._dict_to_list(rowdict)) >>> File "/usr/lib/python2.7/csv.py", line 144, in _dict_to_list ", ".join(wrong_fields)) ValueError: dict contains fields not in fieldnames: n, 6, s, 2, f, 0, e, 1 

Simplemente no entiendo esto en este punto. Lo hace tanto con la biblioteca csv de Python normal como con la biblioteca csv de Unicode que he encontrado. ¿Alguien puede explicar cuál es el problema?

Tú quieres la writerow no la writerows .

El primero toma un solo argumento, que es la fila a escribir. Este último toma un iterable de filas. Está llamando a writerows con un diccionario, que intenta recorrer el diccionario y escribir cada entrada. Dado que la iteración sobre los dictados proporciona sus claves, esto es lo mismo que llamar a writerow(n6s2f0e1) que (obviamente) falla con el error que ve.