2017-08-06 57 views
0

如何在python中创建“子流”。假设我打开了一个文件供阅读。我想返回一个类似文件的对象,您可以使用它来只读取该文件的一部分。在python中创建子流

with open(filename, 'rb') as f: 
    start = 0x34 
    size = 0x20 
    return Substream(f, start, size) # <-- How do I do this? 

在此对象上寻求0应该去f对象的“开始”。进一步阅读过去的大小应该会触发eof行为。希望这是有道理的。我该如何做到这一点?

回答

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

我不知道这是否可以在文件描述符级别上进行,而不是莫名其妙......?