Python:为什么我得到UnicodeDecodeError?

时间:2013-01-09 17:03:51

标签: python file-io python-unicode

我有以下代码使用RE搜索文件,如果找到任何匹配项,则会将文件移动到其他目录中。

import os
import gzip
import re
import shutil

def regEx1():
    os.chdir("C:/Users/David/myfiles")
    files = os.listdir(".")
    os.mkdir("C:/Users/David/NewFiles")
    regex_txt = input("Please enter the string your are looking for:")
    for x in (files):
        inputFile = open((x), "r")
        content = inputFile.read()
        inputFile.close()
        regex = re.compile(regex_txt, re.IGNORECASE)
        if re.search(regex, content)is not None:
            shutil.copy(x, "C:/Users/David/NewFiles")

当我运行它时,我收到以下错误消息:

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Python33\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 0x9d in position 367: character maps to <undefined>

请有人解释为什么会显示此消息

4 个答案:

答案 0 :(得分:9)

在python 3中,当您打开文件以便以文本模式(r)阅读时,它会将包含的文本解码为unicode。

由于您没有指定用于读取文件的编码,因此正在使用平台默认值(来自locale.getpreferredencoding),在这种情况下失败。

您需要指定可以解码文件内容的编码,或者以二进制模式打开文件(并为正则表达式使用b''字节模式)。

有关详细信息,请参阅Python Unicode HOWTO

答案 1 :(得分:1)

我对python 3x不太熟悉,但下面的内容可能会有效。

inputFile = open((x, encoding="utf8"), "r")

答案 2 :(得分:1)

这里有一个类似的问题: Python: Traceback codecs.charmap_decode(input,self.errors,decoding_table)[0]

但你可能想尝试:

 open((x), "r", encoding='UTF8')

答案 3 :(得分:0)

非常感谢您提供此解决方案。它帮助了我另一个主题,我用过:

exec (open ("DIP6.py").read ())

我收到此错误,因为我在DIP6.py的评论中有这个符号:

 #       ● en première colonne

它适用于:

exec (open ("DIP6.py", encoding="utf8").read ())

它还解决了以下问题:

print("été") for example

在DIP6.py

我得到了:

été

在控制台中。

谢谢:-)。