ValueError:dict包含不在fieldname中的字段

时间:2014-11-15 09:04:18

标签: python csv

有人可以帮我解决这个问题。

我有我的选择查询

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

当我下载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

提前谢谢。

3 个答案:

答案 0 :(得分:87)

正如错误消息明确指出的那样,您的词典包含的fieldnames参数中没有相应条目的键。假设这些只是额外的字段,您可以忽略它们by using the extrasaction parameter during construction of your DictWriter object

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

答案 1 :(得分:15)

如错误所述:来自查询的字典包含的密钥多于您在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)

然而,Tim Pietzcker的答案是最好的。

答案 2 :(得分:0)

大家好,谢谢你的回答。 我终于找到了如何制作它。 这是代码

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