Файл CSV Python 3, предоставляющий UnicodeDecodeError: кодек "utf-8" не может декодировать ошибку байта при печати
У меня есть следующий код в Python 3, который предназначен для печати каждой строки в файле csv.
import csv
with open('my_file.csv', 'r', newline='') as csvfile:
lines = csv.reader(csvfile, delimiter = ',', quotechar = '|')
for line in lines:
print(' '.join(line))
Но когда я запускаю его, он дает мне эту ошибку:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 7386: invalid start byte
Я просмотрел файл csv, и получается, что если я вытащу один сингл (маленький n с тильдой сверху), каждая строка будет отлично отпечатана.
Моя проблема в том, что я просмотрел множество различных решений для подобных проблем, но я до сих пор не знаю, как это исправить, что декодировать/кодировать и т.д. Простое извлечение символа в данных НЕ вариант.
Ответы
Ответ 1
Мы знаем, что файл содержит байт b'\x96'
, поскольку он упоминается в сообщении об ошибке:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 7386: invalid start byte
Теперь мы можем написать немного script, чтобы узнать, есть ли какие-либо кодировки, где b'\x96'
декодируется до ñ
:
import pkgutil
import encodings
import os
def all_encodings():
modnames = set([modname for importer, modname, ispkg in pkgutil.walk_packages(
path=[os.path.dirname(encodings.__file__)], prefix='')])
aliases = set(encodings.aliases.aliases.values())
return modnames.union(aliases)
text = b'\x96'
for enc in all_encodings():
try:
msg = text.decode(enc)
except Exception:
continue
if msg == 'ñ':
print('Decoding {t} with {enc} is {m}'.format(t=text, enc=enc, m=msg))
что дает
Decoding b'\x96' with mac_roman is ñ
Decoding b'\x96' with mac_farsi is ñ
Decoding b'\x96' with mac_croatian is ñ
Decoding b'\x96' with mac_arabic is ñ
Decoding b'\x96' with mac_romanian is ñ
Decoding b'\x96' with mac_iceland is ñ
Decoding b'\x96' with mac_turkish is ñ
Поэтому попробуйте изменить
with open('my_file.csv', 'r', newline='') as csvfile:
к одному из этих кодировок, например:
with open('my_file.csv', 'r', encoding='mac_roman', newline='') as csvfile:
Ответ 2
with open('my_file.csv', 'r', newline='', encoding='ISO-8859-1') as csvfile:
- символ не указан в кодировке UTC-8. Чтобы решить эту проблему, вы можете использовать вместо этого кодировку ISO-8859-1. Для получения более подробной информации об этой кодировке вы можете обратиться по ссылке ниже:https://www.ic.unicamp.br/~stolfi/EXPORT/www/ISO-8859-1-Encoding.html
Ответ 3
Для тех, кто столкнулся с той же ошибкой, показанной в теме, следите за кодировкой вашего csv файла. Возможно, это не UTF-8. Я только что заметил, что LibreOffice создал для меня сегодня файл в кодировке utf-16 без запроса, хотя я не мог воспроизвести это.
Если вы попытаетесь открыть документ в кодировке utf-16 с помощью open(... encoding='utf-8')
, вы получите ошибку:
UnicodeDecodeError: кодек "utf-8" не может декодировать байт 0xff в позиции 0: неверный начальный байт
Для исправления либо укажите кодировку utf-16, либо измените кодировку csv.
Ответ 4
Я также столкнулся с проблемой с Python 3, и моя проблема была решена с использованием типа кодировки как utf-16
with open('data.csv', newline='',encoding='utf-16') as csvfile:
Ответ 5
with open('my_file.csv', 'r', newline='', encoding='utf-8') as csvfile:
Попробуйте открыть файл, как указано выше