кодек ‘utf-8’ не может декодировать байт 0xd5 в позиции 2912: недопустимая ошибка байта продолжения при чтении csv-файла на Python

#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.