кодек '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 предложить мне. И теперь я могу читать свои файлы.