2017-08-06 65 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)) 

我不知道這是否可以在文件描述符級別上進行,而不是莫名其妙......?