小编典典

切换至Python 3导致UnicodeDecodeError

python

我刚刚将Python3解释器添加到Sublime,并且以下代码停止工作:

for directory in directoryList:
    fileList = os.listdir(directory)
    for filename in fileList:
        filename = os.path.join(directory, filename)
        currentFile = open(filename, 'rt')
        for line in currentFile:               ##Here comes the exception.
            currentLine = line.split(' ')
            for word in currentLine:
                if word.lower() not in bigBagOfWords:
                    bigBagOfWords.append(word.lower())
        currentFile.close()

我收到以下异常:

  File "/Users/Kuba/Desktop/DictionaryCreator.py", line 11, in <module>
    for line in currentFile:
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 305: ordinal not in range(128)

我发现这很奇怪,因为据我所知Python3应该在任何地方都支持utf-8。而且,相同的精确代码在Python2.7上可以正常工作。我已经读过有关添加环境变量的信息PYTHONIOENCODING,但是我尝试了-
无济于事(但是,在OS X Mavericks中添加环境变量似乎并不容易,所以也许我在添加变量时做错了什么? /etc/launchd.conf)


阅读 162

收藏
2020-12-20

共1个答案

小编典典

Python 3在读取时 解码 文本文件,在写入时 编码
。默认编码取自locale.getpreferredencoding(False),显然可以返回设置'ASCII'。参见open()函数文档

在文本模式下,如果 编码
未指定使用的编码是与平台相关的:locale.getpreferredencoding(False)被称为获取当前的本地编码。

不应依赖系统设置,而应使用显式编解码器打开文本文件:

currentFile = open(filename, 'rt', encoding='latin1')

在此处设置encoding参数以匹配要读取的文件。

Python 3支持UTF-8作为默认的 源代码

写入可写文本文件也是如此。写入的数据将被编码,并且如果您依靠系统编码,则UnicodeEncodingError除非您明确设置了合适的编解码器,否则很可能会获得异常。编写时使用哪种编解码器取决于您编写的是什么文本以及以后打算如何处理文件。

您可能想阅读Unicode HOWTO中的Python
3和Unicode ,它解释了源代码的编码以及读写Unicode数据。

2020-12-20