Ошибка кодирования / декодирования 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 ])