簡體   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