#python #csv #utf-8
Вопрос:
Я просматриваю строки csv-файла, но сталкиваюсь с этой ошибкой при циклическом просмотре строк: 'utf-8' codec can't decode byte 0xd5 in position 2912: invalid continuation byte
Я просто пытаюсь получить количество строк для файла с помощью этой функции:
def count_lines(filename): row_stored = "" try: with open(filename) as csvfile: data_reader = csv.reader(csvfile) next(data_reader) count = 0 for index, row in enumerate(data_reader): if index == 1220119: print(row) row_stored = row count = 1 return count except Exception as e: print(f'There was a problem with your request: {e}n', row_stored) return False
Строка над ошибочной строкой выглядит так:
['817949019495', 'QMMZN1300568', '4/28/2017', 'Digital Revenue', 'Track', 'Download Europe', 'GB', 'Amazon International - UK', '', '2', '1.2126506333579932', '109926407', '2/28/2017']
И строка, которая выдает ошибку, выглядит так:
['817949019495', 'QMMZN1300568', '4/28/2017', 'Digital Revenue', 'Track', 'Download Europe', 'GB', 'Amazon International - UK', '', '2', '1.2126506333579932', '109926407', '2/28/2017']
Я не вижу никакой разницы между ними. Есть ли что-то с форматированием этой конкретной строки, чего я не вижу?
Примечание: Этот csv-файл имеет размер 3,17 ГБ. Не знаю, является ли это фактором, способствующим
Комментарии:
1. код
b'xd5'.decode('latin1')
даетÕ
иb'xd5'.decode('cp1250')
дает немного другоеŐ
, ноb'xd5'.decode('utf-8')
вызывает ошибку — поэтому ваши данные используют неutf-8
другую кодировку, и вам нужно установить правильную кодировку, когда вы ее читаете.2. код должен вызывать ошибку при чтении — поэтому он возникает раньше
row_stored = row
, и выprint(... row_stored)
можете отображать строку, которая не создает проблем — вы должны проверить следующую строку в файле, чтобы увидеть, в чем проблема.
Ответ №1:
Изменение кодировки устранило эту проблему
with open(filename, encoding="ISO-8859-1") as csvfile:
Комментарии:
1. Неужели?
ISO-8859-1
может декодировать что угодно, даже если это неверная кодировка, поэтому вы можете получить поврежденные символы. Однако я не видел никаких символов, отличных от ASCII, в строке, которая, как вы утверждаете, вызвала ошибку. Байт 0xd5 соответствует символуÕ
в ISO-8859-1.2. Да, удивительно. Не уверен, что все еще вызывало ошибку, но посмотрите снимок экрана, который я сделал с таблицей MySQL, которую я заполнял. (Да, это большой стол)
3. У вас есть точное смещение в файле с неправильным байтом. Сделайте что-нибудь вроде
print(open(file,'rb').read(2930)[:-50])
того, чтобы увидеть, что именно находится вокруг байта ошибки смещения 2912. это считывает первые 2930 байт и печатает последние 50.