ValueError: dict содержит поля не в именах полей

Может кто-нибудь помочь мне с этим.

У меня есть запрос на выбор

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

Спасибо заранее.

Ответы

Ответ 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)

Тем не менее, ответ Тима Пицкера является лучшим.

Ответ 2

Как ясно указано в сообщении об ошибке, ваш словарь содержит ключи, у которых нет соответствующей записи в вашем параметре fieldnames. Предполагая, что это просто дополнительные поля, вы можете игнорировать их с помощью параметра extrasaction во время построения вашего объекта 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 = ';')

Ответ 3

Привет всем, спасибо за ответ. Наконец я узнал, как это сделать. вот код

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