python - 使用编码打开内存映射文件

标签 python python-2.7 python-3.x encoding memory-mapped-files

Memory mapped file是使用正则表达式或对大型二进制文件进行操作的有效方法。

如果我有一个大文本文件 (~1GB),是否可以使用编码感知映射文件?
[\u1234-\u5678] 之类的正则表达式不适用于 bytes 对象,将模式转换为 unicode 也不起作用(如 [\u1234-\u5678]".encode("utf-32") 例如将无法正确理解范围)。
如果我使用 .encode() 将搜索模式从 str 转换为 bytes ,搜索可能会起作用,但它仍然有些受限,应该有一个更简单的方式而不是整天解码和编码。

我尝试用 io.TextIOWrapper 将其包装在 io.BufferedRandom 中,但无济于事:

AttributeError: 'mmap.mmap' object has no attribute 'seekable'

创建包装器(使用继承)并设置方法 seekablereadablewritable 以返回 True也没有用。

关于编码,固定长度的编码,如 utf-32,代码点或 utf-16 的较低 BMP(如果它甚至可能仅指那部分) 可以假设。

欢迎使用任何 python 版本的解决方案。

最佳答案

如果不从头开始重新发明轮子(编写所有新版本的 re 模块、mmap 模块等),或者编写非常复杂的正则表达式,不能使用诸如真正的 Unicode 字符范围之类的东西的优点(你可以在三种不同的模式之间进行交替来制作 [\u1234-\u5678],比如 (?:\x12[\x34-\xff]|[\x13-\x55].|\x56[\x00-\x78])).

基本上,re 模式仅适用于 str,或适用于类似 bytes 的对象(并且您不能尝试变通它与 memoryview 和转换,因为 re 仍然将其视为字节,而不是更大的类型)。

对于简单的搜索,您可以尝试使用 mmap.find在对用于搜索的字符串进行编码之后,但这仍然容易出现细微的错误;对于 UCS-2 或 UTF-32,您需要检查 find 的返回值是否分别在两个或四个字节的边界上对齐,以确保您没有弄错一个字符的结尾和下一个完全不同的角色的开始。如果对齐测试失败,则必须使用上次返回值的 start 偏移量 + 1 重复搜索,直到找到匹配项或 find 返回 -1。在一般情况下,这不是一件合理的事情。

关于python - 使用编码打开内存映射文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36229717/

相关文章:

javascript - Django-autocomplete-light如何从html获取数据?

python - 使用自定义 django 模型后无法登录

python - Django-CMS apphooks 菜单和反向

python 2.7 argparse : How can a mutually exclusive group be created in a normal argument group?

python - 如何组合元组列表中的值?

python - 类型错误:不支持的操作数类型

python - 自定义 keras 回调和改变变分自动编码器损失函数中正则化项的权重 (beta)

python-3.x - 什么是 Python 3 `str.__getitem__` 计算复杂度?

python - “NoneType”对象不可订阅?

python - Pandas - 在列中找到第一个非空值