2013-05-27 94 views
0

我本來問這個IRC上,但它可能是最糟糕的問題真正得到回答有:包裝二進制IO

我如何包裝一個二進制流/緩衝而不只是讀整個緩衝區到內存,對它進行操作,並從結果中創建一個新的緩衝區?

具體地說我說的是原始流是一個內存io.BytesIO對象或openb(二進制)標誌集的結果。

我目前的應用程序是在通過HTTP發送每個塊之前調整塊大小(這顯然超出了這個問題的範圍),但我通常也對如何處理改變行爲感興趣沒有破壞其接口的緩衝區。

+0

你是詢問*懶*操作,或約事後重繞流(所以對於一個打開的文件,以後調用'read'仍然會從頭讀取)? – Cairnarvon

+0

是的,這樣做的目的基本上是避免將巨大的物體拉入記憶中,然後對整個事物進行操作(如此懶惰)。我很滿意這種行爲生成器,每個塊只能被讀取一次,也就是說,倒帶或非順序塊訪問並不重要。 (通過「塊」我只是指整體的一部分,不一定是固定大小或包含獨立有用的東西。) –

+0

哦,另一件事:如果原始流被緩衝並且具有與塊不同的固定塊大小包裝器知道如何處理大小,即使原始流中的部分塊將保留並需要轉入下一次處理迭代,也可以拉入足夠的塊進行處理。 –

回答

0

一個BufferedStream將包裝原始IO流,並根據需要由大小調整功能可以被讀:

http://docs.python.org/2/library/io.html#buffered-streams

+0

如果你從一個緩衝流開始,那麼它可以被包裝在一個原始IO流中(假設這只是從緩衝流中讀取足夠的整個塊,以提供所請求的原始流的視圖並處理超過的數據,假設順序訪問到原始流,這是我所關心的),所以你的方法可以被使用?這有道理嗎? –

+0

這是另一種方式......原始IO流由緩衝流包裝。否則,我認爲你的解釋是正確的。緩衝流將管理根據需要從基礎原始流中讀取正確數量的數據。 – Stefan

+0

我的意思是,如果我寫的東西不能選擇是否通過了一個原始流並且它通過了一個緩衝流,爲了使用你的方法,這聽起來像我首先需要將緩衝流轉換爲一個原始流,因此它可以用一個緩衝流包裝,塊大小設置爲resize函數知道如何處理的東西。 –