Python ValueError:dict包含字段名中不包含的字段

Python ValueError:dict包含字段名中不包含的字段,python,csv,Python,Csv,有人能帮我吗 我有我的选择查询 selectAttendance = """SELECT * FROM table """ 我想要我的select查询的内容,并在下载csv文件时包含一个标题, 所以我做了这个查询: with open(os.path.join(current_app.config['UPLOAD_FOLDER'], 'csv.csv'), 'wb') as csvfile: writer = csv.DictWriter(csvfile,fie

有人能帮我吗

我有我的选择查询

selectAttendance = """SELECT * FROM table """
我想要我的select查询的内容,并在下载csv文件时包含一个标题, 所以我做了这个查询:

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()
但它给了我这个错误

**ValueError: dict contains fields not in fieldnames**
我希望在下载的csv文件中有类似的输出:

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

提前感谢。

正如错误消息明确指出的那样,您的字典包含的键在
字段名中没有相应的条目。假设这些只是额外字段,您可以忽略它们:


如错误所述:来自查询的字典包含的键多于您在DictWriter构造函数中指定的字段名

一种解决方案是提前过滤,类似这样:

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)
另一种解决方案是仅使用以下字段构造查询:

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

然而,蒂姆·皮茨克的回答是最好的。

大家好,谢谢你们的回答。 我终于知道怎么做了。 这是密码

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

那么,您是否查看了字典并将其与您指定的标题进行了比较?错误消息中有什么不清楚?我不知道ValueError之后的原因:dict包含字段而不是字段名中的字段:**select***的内容没有保存在指定的CSVBE中,因为在错误发生后什么也没有发生;程序崩溃了。@BartoszKP我在这里,因为我不明白错误消息,你能解释一下吗?
    w = csv.writer(file(r'test.csv','wb'), delimiter=';')
    w.writerows([["Bio Id","Last Name",.....]])
    w.writerows(db.session.execute(selectAttendance))
    db.session.commit()