Используя tablib и django-import-export для импорта данных, получая ошибку с Excel, но с CSV это работает

Сначала пытаясь прочитать данные Excel / CSV, чтобы проверить их перед вставкой в ​​базу данных, хотя CSV работает нормально, может читать данные, но xlsx и xlx показывают следующую ошибку

UnicodeDecodeError в /academy/add_advisor 'utf-8' кодек не может декодировать байт 0xa1 в позиции 10: недопустимый начальный байт

Фрагмент моего кода:

from tablib import Dataset
this_file = request.FILES['bulk_file']

dataset = Dataset()
imported_data = dataset.load(this_file.read().decode("utf-8"),format='xlsx')

for data in dataset:
    print(data[0], data[1], data[2], data[3], data[4])

Согласно сообщению об ошибке из этой строки

imported_data = dataset.load(this_file.read().decode("utf-8"),format='xlsx')

Файл Excel, который я пытаюсь импортировать, я скачал с google drive excel как файл xlsx (microsoft excel). Также скачал один из xlsx файла onedrive(microsoft), все еще получая ту же ошибку.

Еще несколько способов, с которыми я пытался

imported_data = dataset.load(this_file.read().decode("ISO-8859-1"),format='xlsx')
imported_data = dataset.load(this_file.read().strip().decode("ISO-8859-1"),format='xlsx')
imported_data = dataset.load(this_file.read().strip().decode("CP1252"),format='xlsx')
imported_data = dataset.load(this_file.read().strip().decode("windows-1252"),format='xlsx')
imported_data = dataset.load(this_file.read().strip().decode("Latin-1"),format='xlsx')

Но не повезло:(Пожалуйста, поделитесь, если есть какой-нибудь лучший способ, которым я могу попробовать:)(Спасибо за чтение:)

1 ответ

Решение

Хорошо, если ваш the_file является .xlsx файл, то, вероятно, нет смысла декодировать поток вручную: .xlsx это сжатый поток XML-файлов. Таким образом, это означает, что он не следует стандартному строковому кодированию.

Но dataset.load(..) также предполагает, что ей не нужна строка, ей нужны данные, которые она намеревается загрузить. В случае .xlsx файл, то есть двоичные данные, поэтому мы можем использовать .read() прочитать содержимое файла в двоичную строку и, таким образом, dataset сделать правильную обработку, например:

imported_data = dataset.load(this_file.read(),format='xlsx')
Другие вопросы по тегам