Получение UnicodeDecodeError при чтении Excel в Tornado, Python - PullRequest
0 голосов
/ 06 июня 2018

Я использую почтальон для отправки файла Excel, который я читаю в Торнадо.


Код Торнадо

self.request.files['1'][0]['body'].decode()

здесь, если я отправлю .csv чем, вышеупомянутый код работает.


, если я отправляю .xlsx файл, чем я застрял с этой ошибкой.

UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0x87 в позиции 10: недопустимый начальный байт


request.files извлечет файл, но тип будет байтовым.поэтому для преобразования байта в str я использовал decode (), который работает только для .csv, но не для .xlsx

я пробовал декодировать ('utf-8'), но все равно не повезло.

Я пытался выполнить поиск, но не нашел проблем с упоминанием проблемы 0x87?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Причина в том, что файл .xlsx имеет другую кодировку, а не utf-8.Вам нужно будет использовать оригинальную кодировку для декодирования файла.

Не существует гарантированного способа узнать кодировку файла программным путем.Я предполагаю, что вы делаете это приложение для обычных пользователей, и поэтому вы будете постоянно сталкиваться с файлами с разными и неожиданными кодировками.

Хороший способ справиться с этим - попытаться декодировать, используя несколько кодировок, на случай, еслиодин терпит неудачу.Пример:

encodings = ['utf-8', 'iso-8859-1', 'windows-1251', 'windows-1252']

for encoding in encodings:
    try:
        decoded_file = self.request.files['1'][0]['body'].decode(encoding)
    except UnicodeDecodeError:
        # this will run when the current encoding fails
        # just ignore the error and try the next one
        pass
    else:
        # this will run when an encoding passes
        # break the loop
        # it is also a good idea to re-encode the 
        # decoded files to utf-8 for your purpose
        decoded_file = decoded_file.encode("utf8")
        break
else:
    # this will run when the for loop ends
    # without successfully decoding the file
    # now you can return an error message
    # to the user asking them to change 
    # the file encoding and re upload
    self.write("Error: Unidentified file encoding. Re-upload with UTF-8 encoding")
    return

# when the program reaches here, it means 
# you have successfully decoded the file 
# and you can access it from `decoded_file` variable

Вот список некоторых распространенных кодировок: Какая кодировка наиболее распространена для каждого языка?

0 голосов
/ 06 июня 2018

попробуйте, следующие предложения здесь :

self.request.files['1'][0]['body'].decode('iso-8859-1').encode('utf-8')
...