如何在Python中使用像内存缓冲区这样的文件?



我不知道正确的术语,也许它被称为页面文件,但我不确定。我需要一种方法来使用磁盘上的文件作为缓冲区,比如bytearray。它应该能够做a = buffer[100:200]buffer[33] = 127这样的事情,而不必让代码意识到它正在后台读取和写入文件。

基本上我需要bytesIO的对立面,它使用内存和文件接口。我需要一种方法来使用一个文件与内存缓冲接口。理想情况下,它不会在每次数据更改时都写入文件(但如果这样做也没关系)。

我需要这个功能的原因是因为我使用的包期望数据在缓冲区对象中,但是我只有4MB的可用内存。不可能把文件载入内存。所以我需要一个像bytearray这样的对象,但是直接读写数据到文件,而不是内存。

在我的用例中,我需要一个micropython模块,但是一个标准的python模块也可以工作。有什么模块可以做我需要的吗?

这样的东西可以为您工作吗?

class Memfile:
def __init__(self, file):
self.file = file
def __getitem__(self,key):
if type(key) is int:
self.file.seek(key)
return self.file.read(1)
if type(key) is slice:
self.file.seek(key.start)
return self.file.read(key.stop - key.start)
def __setitem__(self, key, val):
assert(type(val) == bytes or type(val) == bytearray)
if type(key) is slice:
assert(key.stop - key.start == len(val))
self.file.seek(key.start)
self.file.write(val)
if type(key) is int:
assert(len(val) == 1)
self.file.seek(key)
self.file.write(val)
def close(self):
self.file.close()

if __name__ == "__main__":
mf = Memfile(open("data", "r+b")) # Assuming the file 'data' have 10+ bytes
mf[0:10] = b'x00'*10
print(mf[0:10]) # b'x00x00x00x00x00x00x00x00x00x00'
mf[0:2] = b'xffxff'
print(mf[0:10]) # b'xffxffx00x00x00x00x00x00x00x00'
print(mf[2]) # b'x00'
print(mf[1]) # b'xff'
mf[0:4] = b'xdexadxbexef'
print(mf[0:4]) # b'xdexadxbexef'
mf.close()

请注意,如果这个解决方案符合您的需求,您将需要在这里做大量的测试

最新更新