Python讀寫二進位制檔案

dicksonjyl560101發表於2017-12-25

Python讀寫二進位制檔案

使用python語言直接讀取普通檔案,可以使用

open('filepath/filename','r')

open函式中,第一個參數列示讀取檔案的路徑,第二個參數列示開啟檔案的模式,

  • ‘r’表示只讀(預設,如果檔案不存在,則會丟擲錯誤)
  • ‘w’表示只寫(如果檔案不存在,則自動建立檔案)
  • ‘a’表示 新寫入的內容附加到檔案的末尾
  • ‘r+’表示 讀寫

如果要以二進位制的方式開啟檔案,需要在第二個引數加上字元“b”(例如,“rb”,“wb”等)。

注意: 在讀取二進位制檔案時,使用linux系統可以不加“b”,但使用windows一定要“b”,否則會以普通文字形式讀取。

Python讀取二進位制檔案

讀取二進位制檔案並儲存為Long型 (讀取原檔案透過UltraEdit檢視16進位制編碼是“78 56 34 12”)

    #以二進位制的方式讀取檔案 #coding: UTF-8  
    fileData = open('/home/ubuntu/staff_sample.dat','rb')   #讀取檔案的前4個位元組   #將讀取的4個位元組轉換為long data_id = struct.unpack("l",fileData.read(4)) print data_id

列印的結果是305419896。

struct.unpack()函式,第一個引數format表示轉換的型別,常用的有:

讀取二進位制檔案並儲存為String型別

原始檔案中字串使用的是TCHAR型別,TCHAR型別的每個字元佔2個位元組,這裡的原始資料是”Staff 頭銜”,使用UE編輯器檢視16進位制編碼是

程式碼:

    data_string = fileData.read(128) readString1 = unicode(data_string,"utf-16") print readString1

程式碼中,

第一句表示從二進位制檔案讀取128個位元組;

第二句表示將讀取出來的資料轉換成utf-16格式編碼的字串。

說明:UTF-16是Unicode的其中一個使用方式,其編碼的方法是:

  • 如果字元編碼U小於0×10000,也就是十進位制的0到65535之內,則直接使用兩位元組表示
  • 如果位元組編碼U大於0×10000,(由於Unicode編碼最大範圍是0x10FFFF),則使用4位元組表示

python 寫入二進位制檔案

1.寫入long型資料

在上面提到python讀取二進位制檔案並轉化為long型,現在逆向將long儲存到檔案中,

    #coding: UTF-8   id = 305419896 parsedata_id = struct.pack("L",id) #將long型305419896儲存到二進位制檔案中 #將long型寫入到檔案中 WriteFileData = open('/home/ubuntu/pythonfile.dat','wb') WriteFileData.write(parsedata_id) WriteFileData.close()

2. 將string型別寫入二進位制檔案

    text = 'Staff 頭銜' text1 = text.encode("UTF-16") texlength = len(text1) text2 = text1[2:texlength] #將long型和string儲存到檔案中 WriteFileData = open('/home/ubuntu/pythonfile.dat','wb') WriteFileData.write(text2); WriteFileData.close()

解釋:上述程式碼中的第二行將字串採用UTF-16表示後,預設UTF-16檔案的開頭,都會自動放置一個U+FEFF字元作為Byte Order Mark(UTF-16以FF FE代表,UTF-16BE以FE FF代表),其中U+FEFF字元在Unicode中代表的意義是ZERO WIDTH NO-BREAK SPACE,即它表示沒有寬度也沒有斷字的空白。

如果寫入的二進位制檔案需要在C、C++語言中使用,或者需要與C、C++的程式通訊時,則需要將FF FE位元組刪除,也就是需要加入上述程式碼中的第三行和第四行,如果只是用於python語言,可不用理會FF FE這兩個開頭位元組。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2149214/,如需轉載,請註明出處,否則將追究法律責任。

相關文章