1. ホーム
  2. python

[解決済み] ValueError: dictにfieldnamesにないフィールドが含まれている。

2022-02-12 13:48:02

質問

どなたか教えてください。

私は私の選択クエリを持っています

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)

しかし、Tim Pietzckerの回答は最高です。