从Python UnicodeDecodeError异常获取错误的字节偏移量

2024-04-16 15:48:12 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:

  • 我有大的(大于2GB)文本文件,其中包含感兴趣的数据
  • 在这种情况下,UTF-gt的格式可以是欧洲的90%或gt格式
  • 在一些罕见的情况下,我有其他奇怪的编码

我尝试了:

我开始使用chardet,但是应用程序的性能受到了很大的影响,因为它在检测到其编码之前将整个文件加载到RAM中。然后我想也许我应该把一些有代表性的数据读入chardet的detect方法,但是后来我意识到我没有办法不漏掉任何可能导致问题的随机字符(例如,'®字符会在文本文件中引起问题,否则会被解码为UTF-8。为了避免被击中,除非我必须这样做,我走了这条路:

def get_file_handle(self):
    """
    Default encoding is UTF-8. If that fails, try Western European (Windows-1252), else use chardet to detect
    :return: file handle (f)
    """
    try:
        with codecs.open(self.current_file, mode='rb', encoding='utf-8') as f:
            return f
    except UnicodeDecodeError:
        try:
            with codecs.open(self.current_file, mode='rb', encoding='cp1252') as f:
                return f
        except UnicodeDecodeError:
            # read raw data and detect encoding via chardet (last resort)
            raw_data = open(self.current_file, 'r').read()
            result = chardet.detect(raw_data)
            char_enc = result['encoding']
            with codecs.open(self.current_file, mode='rb', encoding=char_enc) as f:
                return f

虽然这样做是可行的,但在极少数情况下,它会到达第三个/最里面的异常,它仍然会将整个文件读入RAM。简单地读取一些随机的代表性数据可能会漏掉文本文档中有问题的字符。我想做的是:

  • 当我得到UnicodeDecodeError时,回溯的最后一行是:

    UnicodeDecodeError: 'utf8' codec can't decode byte 0xae in position 2867043: invalid start byte

  • 我想获取字节偏移量(0xae),然后从文件中获取前后1.000个字符,以供chardet检测,从而包括有问题的字符加上额外的数据来进行编码预测。

我已经知道如何以块的形式读取数据(但也可以随意添加),主要是我对如何从回溯中获得字节偏移量感兴趣。在


Tags: 数据self编码return情况opencurrent字符
1条回答
网友
1楼 · 发布于 2024-04-16 15:48:12

这个怎么样:

except UnicodeDecodeError as e:
    # read raw data and detect encoding via chardet (last resort)
    with open(self.current_file, 'r') as f:
        f.seek(e.start - 1000)
        raw_data = f.read(2000)
        result = chardet.detect(raw_data)
        ...

相关问题 更多 >