Ошибка кодирования / декодирования Python для 'cp866'

6.5, и я пытаюсь извлечь некоторую информацию из файла CSV, но файл написан на русском языке, поэтому мне нужно использовать "cp866" для его декодирования. Тем не менее, я не могу получить правильный вывод.

Это код, который я использую:

def printcsv():
    with open('vocabulary.csv',newline='') as f:
      reader = csv.reader(f)
      for row in reader:
          #store in array
          print(row.decode('cp866'))

Это ошибка, которую я получил:

"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa7 in position 0: ordinal not in range(128)

1 ответ

Упс, это не правильный способ чтения зашифрованного CSV-файла. Вот что вы пытаетесь сделать:

with open('vocabulary.csv',newline='') as f: # open the file with default system encoding
  reader = csv.reader(f)                     # declare a reader on it
  for row in reader:                         # here comes the problem

Я предполагаю, что ваша система использует ASCII для кодировки по умолчанию. Поэтому, когда читатель пытается загрузить строку, строка (из байтов) считывается из файла и декодируется в строку с кодировкой ascii по умолчанию.

И все равно, row это список, а не строка, так row.decode вызвал бы ошибку, если бы вы достигли этой линии.

Правильный способ, если указать кодировку файла при его открытии:

def printcsv():
    with open('vocabulary.csv',newline='', encoding='cp866') as f:
      reader = csv.reader(f)
      for row in reader:
          #store in array

Но я не уверен в

          print(row)

В зависимости от того, какая кодировка используется sys.stdoutВы могли бы явно кодировать каждую строку из массива:

          print([ field.encode(encoding) for field in row ])
Другие вопросы по тегам