El códec ‘utf-8’ no puede decodificar un byte leyendo un archivo en Python3.4 pero no en Python2.7

Estaba intentando leer un archivo en python2.7, y fue leído perfectamente. El problema que tengo es cuando ejecuto el mismo progtwig en Python3.4 y luego aparece el error:

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

Además, cuando ejecuto el progtwig en Windows (con python3.4), el error no aparece. La primera línea del documento es: Codi;Codi_lloc_anonim;Nom

y el código de mi progtwig es:

 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) 

En Python2,

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

Lee las líneas del archivo como bytes .

En Python3, el mismo código lee las líneas del archivo como cadenas . Las cadenas Python3 son lo que Python2 llama objetos unicode . Estos son bytes decodificados según alguna encoding. La encoding predeterminada en Python3 es utf-8 .

El mensaje de error

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

muestra que Python3 está intentando decodificar los bytes como utf-8 . Dado que hay un error, el archivo aparentemente no contiene bytes codificados en utf-8 .

Para solucionar el problema, debe especificar la encoding correcta del archivo:

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

Si no conoce la encoding correcta, puede ejecutar este progtwig para simplemente probar todas las codificaciones conocidas de Python. Si tiene suerte, habrá una encoding que convierte los bytes en caracteres reconocibles. En ocasiones, puede parecer que más de una encoding funciona, en cuyo caso deberá verificar y comparar los resultados con cuidado.

 # 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 

Ok, hice lo mismo que @unutbu dime. El resultado fue una gran cantidad de codificaciones, una de ellas es cp1250, por eso cambio:

 f = open(filename,'r') 

a

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

Como @triplee me sugieren. Y ahora puedo leer mis archivos.