繁体   English   中英

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

[英]Is there a Python module for transparently working with a file-like object as a buffer?

我正在研究纯Python解析器,其输入数据的大小可以从千字节到千兆字节。 是否有一个包装文件类对象的模块,并将显式的.open()/。seek()/。read()/。close()调用抽象为一个类似缓冲区的简单对象? 您可能会将此视为StringIO的反转。 我希望它可能看起来像:

with FileLikeObjectBackedBuffer(urllib.urlopen("http://www.google.com")) as buf:
    header = buf[0:0x10]
    footer = buf[-0x10:]

注意,昨天我问了一个类似的问题 ,并接受了mmap的文件。 在这里,我特意寻找一个包装文件类对象的模块(为了参数的缘故,比如urllib返回的内容)。

更新自从我第一次提出问题以来,我一再回到这个问题,结果发现urllib可能不是最好的例子。 它是一个特殊的案例,因为它是一个流媒体接口。 StringIObz2暴露了一个更传统的seek / read / close界面,我个人经常使用它们。 因此,我编写了一个模块,它将类文件对象包装为缓冲区。 你可以在这里查看

虽然urllib.urlopen返回一个类似文件的obj,但我不相信它可以在不编写自己的情况下做你想做的事 - 它不支持seek ,但是支持nextread等......而且你自己“处理只有前进的流 - 您必须通过检索来处理跳跃,直到达到某个点并缓存任何回溯。

恕我直言 - 你不能有效地跳过网络IO流的一部分(如果你想要最后一个字节,你仍然必须得到所有以前的字节到达那里 - 你如何管理存储由你决定)。

我会想要按照你之前的回答来urlretrieve (或类似)文件和mmap

如果你的服务器可以接受ranges (并且响应大小是已知的,并且根据你的例子来自那个派生的块),那么可能的解决方法是使用http://en.wikipedia.org/wiki/Byte_serving (但不能说我曾尝试过这样做。

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

from string import ascii_lowercase
from random import choice
from StringIO import StringIO

buf = ''.join(choice(ascii_lowercase) for _ in range(50))
print buf

sio_buf = StringIO(buf) # make it a bit more like a stream object
first16 = sio_buf.read(16)
print first16

from collections import deque
last16 = deque(iter(lambda: sio_buf.read(1), ''), 16) # read(1) may look bad but it's buffered anyway - so...
print ''.join(last16)

输出:

gpsgvqsbixtwyakpgefrhntldsjqlmfvyzwjoykhsapcmvjmar
gpsgvqsbixtwyakp
wjoykhsapcmvjmar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM