是否有一个Python模块可以透明地使用类似文件的对象作为缓冲区?

是否有一个Python模块可以透明地使用类似文件的对象作为缓冲区?,python,Python,我正在开发一个纯Python解析器,其中输入数据的大小可能在千字节到千兆字节之间。是否有一个模块可以包装类似文件的对象,并将显式的.open()/.seek()/.read()/.close()调用抽象到类似缓冲区的简单对象中?你可能会认为这是StringIO的反面。我想它可能看起来像: with FileLikeObjectBackedBuffer(urllib.urlopen("http://www.google.com")) as buf: header = buf[0:0x10]

我正在开发一个纯Python解析器,其中输入数据的大小可能在千字节到千兆字节之间。是否有一个模块可以包装类似文件的对象,并将显式的.open()/.seek()/.read()/.close()调用抽象到类似缓冲区的简单对象中?你可能会认为这是StringIO的反面。我想它可能看起来像:

with FileLikeObjectBackedBuffer(urllib.urlopen("http://www.google.com")) as buf:
    header = buf[0:0x10]
    footer = buf[-0x10:]
注意,我昨天问了一个问题,并接受了
mmap
ing一个文件。在这里,我特别寻找一个封装类似文件的对象的模块(为了参数起见,比如说像
urllib
返回的内容)

更新
自从我第一次问这个问题以来,我就一直在重复这个问题,结果证明
urllib
可能不是最好的例子。这有点特殊,因为它是一个流接口
StringIO
bz2
公开了一个更传统的
seek
/
read
/
关闭
界面,我个人更经常使用这些界面。因此,我编写了一个模块,将类似文件的对象包装为缓冲区。你可以去看看

虽然
urllib.urlopen
返回一个类似obj的文件,但我不相信不编写自己的文件就可以做你想做的事情-例如,它不支持
seek
,但支持
next
read
等。。。由于您处理的是一个只向前的流,所以您必须通过检索直到到达某个点并缓存任何回溯来处理跳转aheads

IMHO—您无法高效地跳过网络IO流的一部分(如果您想要最后一个字节,您仍然必须获取所有以前的字节才能到达该流—如何管理该存储取决于您)

我很想
url检索
(或类似)该文件,并按照您先前的回答
mmap

如果您的服务器可以接受
范围
(并且响应大小是已知的,并且根据您的示例从派生的块中获得),那么可能的解决方法是使用(但不能说我曾经尝试过)

举个例子,如果你只想要前16个和后16个,而不想做“太花哨”的事情:

输出:

gpsgvqsbixtwyakpgefrhntldsjqlmfvyzwjoykhsapcmvjmar
gpsgvqsbixtwyakp
wjoykhsapcmvjmar

这是一个很好的答案,给出了我问题中的例子。我没有意识到
urllib
对象不支持
seek()
ing。谢谢@我希望有人有更好的建议。如果服务器支持使用
Range
来获取您的前16个字符(简单的
.read(16)),则不使用
Range
和最后16个字节使用
urllib.urlopen
你必须一直读取数据,直到你到达那里…@WilliBallenthin还添加了一点关于使用deque并使用它来消费返回的流的内容-不确定这是否真的有帮助…是的,我会把这个问题再开放一点,看看其他人是否有任何想法。我是真的我根本不使用
urllib
(这只是一个例子),但你的回答鼓励我更仔细地思考“类似文件的对象”到底是什么。我想如果有
.seek()
.read()的话,可能会有一个更好的问题
,是否存在这样一个模块。不过,我很感谢你的回答!@WilliBallenthin-YW-但在这一点上,很有必要重新措辞这个问题-并用措辞表达你想从某个任意iterable实现的目标,而不是像你现在这样使用一个特定的用例-可以得到关于这个案例的更有意义的答案:)如果基础对象不支持
.seek()
,您能否提供有关
\uu getitem\uuuu()
方法的预期语义的更多详细信息?看来
mmap
ing一个临时文件是最简单的解决方案。您可以将其与基于
的解决方案tempfile.SpooledTemporaryFile()
进行比较,该解决方案将在
.seek()
方面实现
.getitem()
,并根据所需语义将类似文件的对象一次性复制到
SpooledTemporaryFile
中,或者根据需要在
\uu getitem()
方法中复制它。
gpsgvqsbixtwyakpgefrhntldsjqlmfvyzwjoykhsapcmvjmar
gpsgvqsbixtwyakp
wjoykhsapcmvjmar