电竞比分网-中国电竞赛事及体育赛事平台

分享

Python讀寫二進制文件 [Python俱樂部]

 herowuking 2015-08-11

Python讀寫二進制文件

使用python語言直接讀取普通文件,可以使用

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

open函數(shù)中,第一個參數(shù)表示讀取文件的路徑,第二個參數(shù)表示打開文件的模式,

  • ‘r’表示只讀(缺省,如果文件不存在,則會拋出錯誤)
  • ‘w’表示只寫(如果文件不存在,則自動創(chuàng)建文件)
  • ‘a(chǎn)’表示 新寫入的內(nèi)容附加到文件的末尾
  • ‘r+’表示 讀寫

如果要以二進制的方式打開文件,需要在第二個參數(shù)加上字符“b”(例如,“rb”,“wb”等)。

注意: 在讀取二進制文件時,使用linux系統(tǒng)可以不加“b”,但使用windows一定要“b”,否則會以普通文本形式讀取。

Python讀取二進制文件

讀取二進制文件并保存為Long型 (讀取原文件通過UltraEdit查看16進制編碼是“78 56 34 12”)

    #以二進制的方式讀取文件
    #coding: UTF-8
 
    fileData = open('/home/ubuntu/staff_sample.dat','rb')
 
    #讀取文件的前4個字節(jié)   #將讀取的4個字節(jié)轉(zhuǎn)換為long
    data_id = struct.unpack("l",fileData.read(4))
    print data_id

打印的結果是305419896。

struct.unpack()函數(shù),第一個參數(shù)format表示轉(zhuǎn)換的類型,常用的有:

讀取二進制文件并保存為String類型

原始文件中字符串使用的是TCHAR類型,TCHAR類型的每個字符占2個字節(jié),這里的原始數(shù)據(jù)是”Staff 頭銜”,使用UE編輯器查看16進制編碼是

代碼:

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

代碼中,

第一句表示從二進制文件讀取128個字節(jié);

第二句表示將讀取出來的數(shù)據(jù)轉(zhuǎn)換成utf-16格式編碼的字符串。

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

  • 如果字符編碼U小于0×10000,也就是十進制的0到65535之內(nèi),則直接使用兩字節(jié)表示
  • 如果字節(jié)編碼U大于0×10000,(由于Unicode編碼最大范圍是0x10FFFF),則使用4字節(jié)表示

python 寫入二進制文件

1.寫入long型數(shù)據(jù)

在上面提到python讀取二進制文件并轉(zhuǎn)化為long型,現(xiàn)在逆向?qū)ong保存到文件中,

    #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字節(jié)刪除,也就是需要加入上述代碼中的第三行和第四行,如果只是用于python語言,可不用理會FF FE這兩個開頭字節(jié)。 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多