Ошибка кодирования / декодирования Python для 'cp866' - PullRequest
0 голосов
/ 13 июня 2018

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 Ответ

0 голосов
/ 13 июня 2018

Упс, это не правильный способ чтения закодированного 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 ])
...