在python中创建子流

时间:2017-08-06 13:03:15

标签: python-3.x

如何创建"子流"在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行为。希望这是有道理的。我该如何做到这一点?

1 个答案:

答案 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))

我想知道这是否可以在文件描述符级别上完成而不知道......?