Используя 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')