【问题标题】:Unicode error handling with Python 3's readlines()使用 Python 3 的 readlines() 处理 Unicode 错误
【发布时间】:2012-05-16 06:49:39
【问题描述】:

我在阅读文本文件时不断收到此错误。是否可以处理/忽略它并继续?

UnicodeEncodeError:‘charmap’编解码器无法解码位置上的字节 0x81 7827:字符映射到未定义。

【问题讨论】:

  • 这会根据细节变化很多。蟒蛇2?蟒蛇3?您是否正在尝试解码您已经阅读的字符串?如何?等等。
  • Python 3. 我正在使用 readlines()
  • 好的——更新了问题以指定 Python 3。Unicode 是 2 和 3 之间存在很大差异的地方之一;请务必在以后明确指定版本。
  • 对于更一般的情况,可能值得一看:stackoverflow.com/questions/58199571/…

标签: python python-3.x text encoding


【解决方案1】:

是的..你可以把它包装在一个

try:
    ....
except UnicodeEncodeError: 
    pass

【讨论】:

  • 是的,但这对于解释如何继续阅读文件的其余部分并没有多大帮助。
【解决方案2】:

在 Python 3 中,在创建文件对象时传递适当的 errors= 值(例如 errors=ignoreerrors=replace)(假设它是 io.TextIOWrapper 的子类——如果不是,考虑将其包装成一个!);此外,考虑传递比charmap 更有可能的编码(当您不确定时,utf-8 始终是一个不错的起点)。

例如:

f = open('misc-notes.txt', encoding='utf-8', errors='ignore')

在 Python 2 中,read() 操作只返回字节;那么,诀窍就是解码它们以将它们变成一个字符串(如果你这样做,实际上,需要字符而不是字节)。如果您对它们的真实编码没有更好的猜测:

your_string.decode('utf-8', 'replace')

...替换未处理的字符,或

your_string.decode('utf-8', 'ignore')

简单地忽略它们。

也就是说,最好找到并使用它们的真实编码(而不是猜测utf-8)。

【讨论】:

  • 次要挑剔:在 Python 2 中,诀窍是解码它们,而不是编码。但是您知道这一点,因为您正在调用 decode 方法。
  • @ThomasK 哎呀。缩短了措辞 - 出错的事情更少。感谢校对。 :)
  • 通过传递编码和错误参数,它似乎正在工作。
  • 问题:有没有办法检查文件是用哪种编码生成的?
  • @Bob 确定——只需检查fileobj.encoding(和fileobj.errors 的错误处理模式);只要fileobjTextIOWrapper 就应该可以工作。
【解决方案3】:

您应该使用编解码器打开文件,以确保文件被解释为 UTF8。

导入编解码器 fd = codecs.open(文件名,'r',encoding='utf-8') 数据 = fd.read()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2013-05-13
    • 1970-01-01
    • 2015-11-10
    • 2020-10-14
    相关资源
    最近更新 更多