【问题标题】:Python - UnicodeDecodeError when trying to parse HTML file which is ASCIIPython - 尝试解析 ASCII 的 HTML 文件时出现 UnicodeDecodeError
【发布时间】:2016-04-17 14:31:54
【问题描述】:

我正在使用 Python 2.7.6。

有一个 HTML 文件,其中包含以“$”开头的值。编写了一个程序,它接收 JSON 数据并将前面带有 $ 的值替换为 JSON 值。

在有人用不同的编辑器打开这组 HTML 文件并将其从 UTF-8 更改为 ASCII 之前,这一切正常。

class FileUtil:
    @staticmethod
    def replace_all(output_file, data):
        homedir = os.path.expanduser("~")
        dest_dir = homedir + "/dest_dir"
        with open(output_file, "r") as my_file:
            contents = my_file.read()
        destination_file = dest_dir + "/" + data["filename"]
        fp = open(destination_file, "w")
        for key, value in data.iteritems():
            contents = contents.replace("$" + str(key), value)
        fp.write(contents)
        fp.close()

每当我的程序遇到一个 ASCII 格式的文件时,它就会抛出这个错误:

Traceback (most recent call last):
    File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 239, in process
        return self.handle()
    File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 230, in handle
        return self._delegate(fn, self.fvars, args)
    File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 420, in _delegate
        return handle_class(cls)
    File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 396, in handle_class
        return tocall(*args)
    FileUtil.replace_all(output_file, data)
        File "/home/devuser/demo/utils/fileutils.py", line 11, in replace_all
            contents = contents.replace("$" + str(key), value)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 54826: ordinal not in range(128)

问题:

  1. 有没有办法让python中的内容值严格为UTF-8?

  2. 在运行此 python 脚本之前,使用 Ubuntu Linux 中的命令行实用程序转换文件是否更好?

  3. 错误是否是编码问题(例如文件是 ASCII 而不是 UTF8)?

【问题讨论】:

  • 使用codecs打开文件并处理编码。如果您只需要 UTF-8,则在 Unicode 错误上失败。
  • 您可以使用iconv 转换文件,但如果文件不遵循编码,您将使用什么来转换它?一方面,文件不是 ASCII,因为 ASCII 不使用超过 127 的字节值,这正是错误告诉你的,顺便说一句。在任何情况下,我都会考虑将 Python 升级到版本 3,因为对编码的大部分处理都得到了改进。最后,在线搜索错误信息,了解它的含义,这里有数百个类似的问题,你的并没有增加多少。
  • 问题似乎正好相反。您的程序使用默认的“ascii”编解码器,并且文件不是 ASCII。如果该文件是在 Windows 中打开的,它很可能已更改为“latin-1”。使用codecs.open() 以所需编码打开文件。您可以使用chardet 之类的包来检测文件的编码。
  • roeland - 这是一个不同的问题,恕我直言。

标签: python unicode utf-8 ascii python-unicode


【解决方案1】:

@阿帕拉拉

非常感谢您对 chardet 的关注!这是一个非常有用的工具。

@乌尔里希·埃克哈特

你是对的,它是 UTF-8 而不是 ASCII。

这是解决方案:

iconv --from-code UTF-8 --to-code US-ASCII -c hello.htm > hello.html

【讨论】:

    猜你喜欢
    • 2014-03-11
    • 2019-08-08
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多