在Python中,您可以使用StringIO作爲字符數據的文件類緩衝區。 Memory-mapped file基本上對二進制數據做類似的事情,但它需要一個用作基礎的文件。 Python是否有一個用於二進制數據的文件對象,並且只是內存,相當於Java的ByteArrayOutputStream?Python中的二進制緩衝區
我使用的用例是我想在內存中創建一個ZIP文件,而ZipFile需要一個類似文件的對象。
在Python中,您可以使用StringIO作爲字符數據的文件類緩衝區。 Memory-mapped file基本上對二進制數據做類似的事情,但它需要一個用作基礎的文件。 Python是否有一個用於二進制數據的文件對象,並且只是內存,相當於Java的ByteArrayOutputStream?Python中的二進制緩衝區
我使用的用例是我想在內存中創建一個ZIP文件,而ZipFile需要一個類似文件的對象。
您可能正在尋找io.BytesIO類。它的工作原理完全一樣,除了StringIO的,它支持二進制數據:
from io import BytesIO
bio = BytesIO(b"some initial binary data: \x00\x01")
StringIO的將拋出類型錯誤:
from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")
看看struct包:https://docs.python.org/library/struct.html,它允許您將字符串解釋爲打包的二進制數據。
不知道這是否會完全回答您的問題,但您可以使用struct.unpack()將二進制數據轉換爲python對象。
import struct
f = open(filename, "rb")
s = f.read(8)
x, y = struct.unpack(">hl", s)
INT該示例中,「>」告訴閱讀大端的「h」的讀出2字節的短,並且「L」爲4字節長。你可以明顯地改變這些任何你需要讀出的二進制數據...
只要你不嘗試把任何Unicode數據到你的StringIO
,你注意不要使用cStringIO
你應該是精細。
根據StringIO文檔,只要您保持unicode或8位,一切都按預期工作。據推測,StringIO
做一些特殊的事情時,有人做f.write(u"asdf")
(據我所知ZipFile不這樣做)。無論如何;
import zipfile
import StringIO
s = StringIO.StringIO()
z = zipfile.ZipFile(s, "w")
z.write("test.txt")
z.close()
f = file("x.zip", "w")
f.write(s.getvalue())
s.close()
f.close()
工程只是符合預期,並有在生成的存檔文件和原始文件之間沒有什麼區別。
如果你知道一個特定的情況下,其中這種方法是不行的,我最感興趣聽到它:)
爲什麼cStringIO在這裏不起作用? – 2011-05-10 20:59:36
它應該在大多數情況下工作。我記不起3年前我的想法,但其中一個原因是write()方法的輸入在兩個版本之間略有不同(取決於輸入類型),我不想依賴內部行爲在zipfile中。 – 2011-05-11 20:46:21
你的意思是讓這樣的事情:http://stackoverflow.com/questions/4239666/getting-bytes-from-unicode-string-in-python – yucer 2016-12-27 11:18:59