我想以最低的开发成本将re
模块与流(但不一定是文件流)一起使用。纯Python3中类似Mmap的行为
对于文件流,有mmap
模块可以模拟字符串,因此可以自由使用re
。
现在我想知道mmap
如何管理一个对象,re
可以进一步重用。如果我只是通过任何方式,re
保护自己免受使用与TypeError: expected string or bytes-like object
太不兼容的对象。所以我想我会创建一个派生自string
或bytes
的类,并覆盖一些方法,如__getitem__
等(这直观地适合Python的鸭子打字理念),并使它们与我的原始流进行交互。但是,这似乎并不奏效 - 我的覆盖被完全忽略。
是否有可能在纯Python中创建这样一个“懒惰”的string
,没有C扩展?如果是这样,怎么样?
一点背景无视替代解决方案:
- 不能使用
mmap
(流内容不是文件) - 不能放弃整个事情的HDD(太慢)
- 无法加载整个事情
- 可以寻求内存(太大),知道大小和计算在运行时的内容
示例代码,演示了修改bytes
阻力:
class FancyWrapper(bytes):
def __init__(self, base_str):
pass #super() isn't called and yet the code below finds abc, aaa and bbb
print(re.findall(b'[abc]{3}', FancyWrapper(b'abc aaa bbb def')))
什么__你的流?你可以发布你尝试从'str'派生出来的代码吗? – bbayles
@bbayles我的流包含“数据范围” - 每个“数据范围”可能从内存或硬盘上的文件中获取数据。当要求特定偏移量的数据时,有一项功能可将来自此类距离偏移的信息组合到一个线性内存中。基本上这是一个处理编辑大文件的方法。编辑该帖子以提供最基本的示例。 –
也许我很厚,但请详细说明为什么你不能简单地迭代你的流?对于任何文件,我们都会在fh中做一个'for line:... re.search(line,pattern)...'。对于文件以外的其他内容,使用简单的代码模式,例如[this this for string streams](http://stackoverflow.com/questions/21843693/creating-stream-to-iterate-over-from-string-in-python)。如果您可以查找您的数据,这应该很容易实现。 – cfi