2008-08-24 108 views

回答

69

您可能正在尋找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") 
3

看看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字節長。你可以明顯地改變這些任何你需要讀出的二進制數據...

+0

你的意思是讓這樣的事情:http://stackoverflow.com/questions/4239666/getting-bytes-from-unicode-string-in-python – yucer 2016-12-27 11:18:59

24

只要你不嘗試把任何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() 

工程只是符合預期,並有在生成的存檔文件和原始文件之間沒有什麼區別。

如果你知道一個特定的情況下,其中這種方法是不行的,我最感興趣聽到它:)

+0

爲什麼cStringIO在這裏不起作用? – 2011-05-10 20:59:36

+0

它應該在大多數情況下工作。我記不起3年前我的想法,但其中一個原因是write()方法的輸入在兩個版本之間略有不同(取決於輸入類型),我不想依賴內部行爲在zipfile中。 – 2011-05-11 20:46:21