Файл 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:

Попробуйте открыть файл, как указано выше