2016-11-15 99 views
0

我试图打开带有以下命令的一些配置文件:的UnicodeDecodeError在Python 3.5试图打开文本文件时

f=open(os.path.join(root, name),mode='rt',errors='ignore') 

不过,我升级到Python 3.5后收到以下错误。


for line in f: 
    File "C:\python35-32\lib\encodings\cp1252.py", line 23, in decode 
    return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 57: chara 
cter maps to <undefined> 

此代码工作得很好时,我跑了使用Python 2.7。我试图将编码指定为utf8或latin1,但现在都没有工作。如果任何人都能向我推荐一条前进的道路,这将会非常有帮助。

如果我可以忽略该错误并转到下一行,那就没问题了。我怎样才能跳过错误的部分?

+0

我对python 3不是很熟悉。我认为你打开一个8位编码的文件(例如latin1),而解释器尝试utf-8。你应该检查位置57的字节。你可以追加周围块的十六进制转储(只有几个字节)吗? – clemens

回答

1

尝试指定文件的编码open(os.path.join(root, name), encoding='utf-8')

+0

尝试已经收到以下错误:对于f中的行: 解码中的文件“C:\ python35-32 \ lib \ codecs.py”,第321行 (result,consume)= self._buffer_decode(data, self.errors,final) UnicodeDecodeError:'utf-8'编解码器无法解码位置10中的字节0x82:无效 起始字节 – Suman

+0

因此,该文件的编码与utf-8不同。 –

+0

@谢尔盖:似乎是这样,但前进的方向是什么? – Suman

0

您可以使用codecs.open

import codecs 
f = codecs.open(os.path.join(root, name), mode='rt', encoding='utf-8') 
for line in f: 
    #do something 

另外,我不认为这个问题是你的代码,而是使用Windows命令提示符其编码是'cp1252'。我很早就遇到过这个问题。基本上,如果在Windows命令提示符下运行脚本,并且一旦代码执行打印功能(打印unicode数据),程序就会崩溃,因为Windows命令提示符无法解码并打印它。

您还可以通过打印原始数据来解决此问题。也就是说,将所有打印功能改为print("%r" % line)

+0

尝试使用编解码器和获取以下错误:对于f中的行: 文件“C:\ python35-32 \ lib \ codecs.py”,第711行,在__next__中 return next(self.reader) 文件“C:\ python35-32 \ lib \ codecs.py“,行642,在__next__中 line = self.readline() 文件”C:\ python35-32 \ lib \ codecs.py“,第555行,在readline中 data = self .read(readsize,firstline = True) 文件“C:\ python35-32 \ lib \ codecs.py”,第501行,在读 newchars,decodedbytes = self.decode(data,self.errors) UnicodeDecodeError:' utf-8'编解码器无法解码位置14-15中的字节:无效 延续字节 – Suman

+0

那么,您的文件编码必须是别的东西。打开文件,执行“另存为”并将编码更改为“UTF-8”(不含BOM),然后尝试您的代码。 – user6037143