用编码打开内存映射文件

Bha*_*rel 5 python encoding memory-mapped-files python-2.7 python-3.x

内存映射文件是使用正则表达式或对大型二进制文件进行操作的有效方法。

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

我试过用io.TextIOWrapper里面包裹它io.BufferedRandom但无济于事:

AttributeError: 'mmap.mmap' object has no attribute 'seekable'
Run Code Online (Sandbox Code Playgroud)

创建包装器(使用继承)并设置方法seekablereadablewritable返回True也不起作用。

关于编码,一个固定长度的编码,如utf-32,代码点或较低的 BMPutf-16可能会假设(如果甚至可能仅指该部分)。

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

Sha*_*ger 1

如果不从头开始重新发明轮子(编写模块的所有新版本remmap模块等),或者编写极其复​​杂的正则表达式,而这些正则表达式无法使用真正的 Unicode 字符范围之类的细节(您需要在三种不同的图案之间进行交替[\u1234-\u5678],类似(?:\x12[\x34-\xff]|[\x13-\x55].|\x56[\x00-\x78]))。

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

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