如何创建"子流"在python中。我们说我打开了一个可供阅读的文件。我想返回一个类似文件的对象,您可以使用该对象只读取该文件的一部分。
with open(filename, 'rb') as f:
start = 0x34
size = 0x20
return Substream(f, start, size) # <-- How do I do this?
在这个对象上求0应该转到&#34; start&#34;在f
对象上。进一步阅读过去的大小应该触发eof行为。希望这是有道理的。我该如何做到这一点?
答案 0 :(得分:0)
io.RawIOBase
的快速子类似乎可以解决这个问题,至少在我的用例中是这样。我知道这不是io.RawIOBase interface
的完整实现,但它可以完成工作。
class Substream(io.RawIOBase):
"""Represents a view of a subset of a file like object"""
def __init__(self, file: io.RawIOBase, start, size):
self.file = file
self.start = start
self.size = size
self.p = 0
def seek(self, offset, origin=0):
if origin == 0:
self.p = offset
elif origin == 1:
self.p += offset
# TODO: origin == 2
else:
raise ValueError("Unexpected origin: {}".format(origin))
def read(self, n):
prev = self.file.tell()
self.file.seek(self.start + self.p)
data = self.file.read(n if self.p + n <= self.size else self.size - self.p)
self.p += len(data)
self.file.seek(prev)
return data
像这样使用
with open(filename) as f:
print(Substream(f, 10, 100).read(10))
我想知道这是否可以在文件描述符级别上完成而不知道......?