кодек 'utf-8' не может декодировать байт, считывающий файл в Python3.4 но не в Python2.7

Я пытался прочитать файл в python2.7, и это было прочитано отлично. Проблема в том, что я выполняю ту же программу в Python3.4 и затем появляется ошибка:

'utf-8' codec can't decode byte 0xf2 in position 424: invalid continuation byte'

кроме того, когда я запускаю программу в Windows (с python3.4), ошибка не появляется. Первая строка документа: Codi;Codi_lloc_anonim;Nom

и код моей программы является:

def lectdict(filename,colkey,colvalue):
    f = open(filename,'r')
    D = dict()

    for line in f:
       if line == 'n': continue
       D[line.split(';')[colkey]] = D.get(line.split(';')[colkey],[]) + [line.split(';')[colvalue]]

f.close
return D

Traduccio = lectdict('Noms_departaments_centres.txt',1,2)

2 ответов


В Вместо Python2,

f = open(filename,'r')
for line in f:

считывает строки из файла как байт.

в Python3 тот же код считывает строки из файла как строки. Питон3 строки-это то, что Python2 называет unicode объекты. Эти байты расшифрованы согласно некоторым кодировкам. Кодировка по умолчанию в Python3 -utf-8.

сообщение об ошибке

'utf-8' codec can't decode byte 0xf2 in position 424: invalid continuation byte'

показывает, что Python3 пытается декодировать байты как utf-8. Так как есть ошибка, файл, по-видимому, не содержит utf-8 закодированный байт.

чтобы исправить проблему, вам нужно укажите правильную кодировку файл:

with open(filename, encoding=enc) as f:
    for line in f:

если вы не знаете правильную кодировку, вы можете запустить эту программу просто попробуйте все кодировки, известные Python. Если Вам повезет, будет кодировка, которая превращает байты в узнаваемые символы. Иногда больше чем одна кодировка может появляется для работы, в этом случае вам нужно будет проверить и тщательно сравните результаты.

# Python3
import pkgutil
import os
import encodings

def all_encodings():
    modnames = set(
        [modname for importer, modname, ispkg in pkgutil.walk_packages(
            path=[os.path.dirname(encodings.__file__)], prefix='')])
    aliases = set(encodings.aliases.aliases.values())
    return modnames.union(aliases)

filename = '/tmp/test'
encodings = all_encodings()
for enc in encodings:
    try:
        with open(filename, encoding=enc) as f:
            # print the encoding and the first 500 characters
            print(enc, f.read(500))
    except Exception:
        pass

хорошо, я сделал то же самое, что и @unutbu. В результате было много кодировок, одной из которых является cp1250, по этой причине я меняю:

f = open(filename,'r')

to

f = open(filename,'r', encoding='cp1250')

как @triplee предложить мне. И теперь я могу читать свои файлы.