当前位置: 首页 > 面试题库 >

切换至Python 3导致UnicodeDecodeError

伊飞光
2023-03-14
问题内容

我刚刚将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)


问题答案:

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数据。



 类似资料:
  • 我最近遇到了一个问题,我们的一个遗留应用程序依赖于UPS跟踪API。UPS更改了其通信协议以要求TLSv1。2.不幸的是,JDK1.6的最新公共版本似乎不支持此协议,因此我的选择是支付oracle支持合同或升级到JDK1.7。我升级到了1.7 我改变了项目的依赖关系,一切看起来都很好。当我尝试实际部署到应用程序服务器时,失败了,错误如下: com.sun.xml.bind.v2.runtime.I

  • 我没有使用查看页面,我调用任何片段事务的唯一地方是单击活动布局中导航栏上的按钮。 当我切换到片段太快(像来回),我得到这个例外: java.lang.IllegalStateException:无活动 当我点击切换另一个片段时,第一个片段还没有完全加载完毕。我正在使用碎片活动。 有人能对此发表一些见解吗? 我的代码切换s: 编辑:去掉过渡解决了问题,但我想知道是否有一种方法可以在适当的位置完成过渡

  • 我在c:/program files/java中安装了JRE 1.6和1.7(以及JDK)/ 我先安装了1.7,然后又安装了1.6。我使用Eclipse作为我的IDE——请注意,我是Java新手。 当我想切换到1.6时,我会转到“运行配置”(在Eclipse中)并选择替代JRE,选择1.6并单击应用。但当我尝试运行一个简单的HelloWorld程序时,我收到了以下警报: 找不到主类:HelloW。

  • 我正在使用Javafx(没有使用FXML),我正在将阶段传递到a控制器中,以便在单击按钮时更改阶段上的场景。场景的变化是正确的,但是舞台和场景的尺寸增加了,它的尺寸增加了大约0.1(宽度),而高度有时也增加了(不是每次都增加)。 下面是正在使用的控制器。

  • 我试图运行一个依赖于某些python3库的PySpark作业。我知道我可以在Spark Cluster上安装这些库,但是因为我正在为多个作业重用集群,所以我更愿意捆绑所有依赖项,并通过指令将它们传递给每个作业。 为此,我使用: 它有效地压缩了需要在根级别使用的包中的所有代码。 在my中,我可以导入依赖项 并将.zip添加到我的Spark上下文中 到目前为止还不错。 但出于某种原因,这将在星火星团的

  • 我的计算机使用Intel显卡运行Ubuntu 16.04。我的OpenGL配置文件使用Mesa 11.2。 我简陋的OpenGL程序在窗口中显示一个简单的正方形。如果我按某个键,我想让程序切换到线框图模式,所以我定义了以下回调函数: 不幸的是,在我的程序运行时按m会导致段错误。不过,奇怪的是,在我的另一台计算机(运行Ubuntu 16.04但使用Nvidia GPU)上,我没有这样的问题,并且程序