web-dev-qa-db-fra.com

ValueError: dict contient des champs ne figurant pas dans les noms de champs

Quelqu'un peut il m'aider avec ça. 

J'ai ma requête Select

selectAttendance = """SELECT * FROM table """

Et je veux le contenu de ma requête sélectionnée et inclure un en-tête lorsque je télécharge le fichier csv, J'ai donc fait cette requête:

with open(os.path.join(current_app.config['UPLOAD_FOLDER'], 'csv.csv'), 'wb') as csvfile:
                writer = csv.DictWriter(csvfile,fieldnames  = ["Bio_Id","Last_Name","First_Name","late","undertime","total_minutes", "total_ot", "total_nsd", "total_absences"], delimiter = ';')
                writer.writeheader()
                writer.writerow(db.session.execute(selectAttendance))
            db.session.commit()

mais ça me donne cette erreur

**ValueError: dict contains fields not in fieldnames**

Je veux avoir comme cette sortie dans mon fichier csv téléchargé:

Bio_Id Last_Name First_Name late undertime total_minutes total_ot total_nsd total_absences
1      Joe       Spark       1     1            2            1        1          1

Merci d'avance.

21
akbsmile

Comme l'indique l'erreur: le dictionnaire provenant de la requête contient plus de clés que les noms de champs spécifiés dans le constructeur DictWriter.

Une solution serait de filtrer cela à l’avance, comme ceci:

field_names = ["Bio_Id","Last_Name", ...]
writer = csv.DictWriter(csvfile,fieldnames=field_names , delimiter = ';')
writer.writeheader()
data = {key: value for key, value in db.session.execute(selectAttendance).items()
        if key in field_names}
writer.writerow(data)

Une autre solution pourrait être de construire la requête en utilisant uniquement les champs suivants:

query = 'SELECT %s FROM table' % ', '.join(field_names)

Cependant, la réponse de Tim Pietzcker est la meilleure.

15
bgusach

Comme le message d'erreur l'indique clairement, votre dictionnaire contient des clés qui n'ont pas d'entrée correspondante dans votre paramètre fieldnames. En supposant qu'il ne s'agisse que de champs supplémentaires, vous pouvez les ignorer en utilisant le paramètre extrasaction lors de la construction de votre objet DictWriter :

writer = csv.DictWriter(csvfile, fieldnames=["Bio_Id","Last_Name","First_Name","late","undertime","total_minutes", "total_ot", "total_nsd", "total_absences"], 
                        extrasaction='ignore', delimiter = ';')
81
Tim Pietzcker

Bonjour à tous merci d'avoir répondu. J'ai finalement découvert comment le faire. voici le code

    w = csv.writer(file(r'test.csv','wb'), delimiter=';')
    w.writerows([["Bio Id","Last Name",.....]])
    w.writerows(db.session.execute(selectAttendance))
    db.session.commit()
0
akbsmile