[英]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
可能不是最好的例子。 它是一個特殊的案例,因為它是一個流媒體接口。 StringIO
和bz2
暴露了一個更傳統的seek
/ read
/ close
界面,我個人經常使用它們。 因此,我編寫了一個模塊,它將類文件對象包裝為緩沖區。 你可以在這里查看 。
雖然urllib.urlopen
返回一個類似文件的obj,但我不相信它可以在不編寫自己的情況下做你想做的事 - 它不支持seek
,但是支持next
, read
等......而且你自己“處理只有前進的流 - 您必須通過檢索來處理跳躍,直到達到某個點並緩存任何回溯。
恕我直言 - 你不能有效地跳過網絡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.