gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:21:18 25 4
gpt4 key购买 nike

问题:

  • 我有包含感兴趣数据的大型 (>2GB) 文本文件
  • 在 >90% 的情况下,我可以假设此数据的格式为 UTF-8 或西欧
  • 在极少数情况下,我有其他奇怪的编码

我尝试过的:

我一开始使用 chardet,但该应用程序的性能受到了重大影响,因为它在检测其编码之前将整个文件加载到 RAM 中。然后我想也许我应该将一些代表性数据读入 chardet 的检测方法,但后来意识到我无法不丢失任何可能导致问题的随机字符(例如“®”字符将在文本文件中导致问题否则将解码为 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”编解码器无法解码位置 2867043 中的字节 0xae:无效起始字节

  • 我想获取字节偏移量 (0xae),然后从文件中抓取前后 1.000 个字符以提供给 chardet 进行检测,从而包括有问题的字符以及其他字符编码预测所依据的数据。

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

最佳答案

这个怎么样:

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)
...

关于python - 从 Python UnicodeDecodeError 异常获取错误的字节偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33111078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com