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.
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.
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 = ';')
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()