【问题标题】:ValueError: dict contains fields not in fieldnamesValueError:字典包含不在字段名中的字段
【发布时间】:2015-01-12 16:30:05
【问题描述】:

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

我有我的选择查询

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

提前谢谢你。

【问题讨论】:

  • 那么您是否查看了字典并将其与您指定的标题进行了比较?
  • 错误信息中有什么不清楚的地方?
  • 不知道为什么在 ValueError: dict contains fields not in fieldnames:***content of the select*** not save in the specified csv
  • 因为报错后什么都没有发生;程序崩溃了。
  • @BartoszKP 我在这里因为我不明白错误消息,你能解释一下吗?

标签: python csv


【解决方案1】:

大家好,感谢您的回答。 我终于知道如何制作它了。 这是代码

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

【讨论】:

    【解决方案2】:

    如错误所述:来自查询的字典包含的键比您在 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 的回答是最好的。

    【讨论】:

      【解决方案3】:

      正如错误消息明确指出的那样,您的字典包含在您的 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 = ';')
      

      【讨论】:

        猜你喜欢
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        相关资源
        最近更新 更多