python文件處理--筆記


   之前一段時間一直在忙着寫畢業論文,盲評搞得人心惶惶,以致於都沒有看書,最近需要補上前面落下的東西。

《Python3程序開發指南》

1、二進制數據的讀寫

二進制格式通常是占據磁盤空間最小、保存與加載速度最快的數據格式。最簡單的方法是使用pickle

   pickle模塊主要提供了數據持久化功能

  序列化可使用dumps()函數,逆序列化使用loads()函數,將文件中的數據解析為一個python對象。

  現有5種版本的pickle模塊,分別為0到4

  pickle模塊提供的常量:

  pickle.HIGHEST_PROTOCOL:整型,最高協議版本

  pickle.DEFAULT_PROTOCOL:序列化中默認的協議版本,可能會低於HIGHEST_PROTOCOL,目前默認協議為3

pickle模塊提供的函數:

  1、pickle.dump(obj,file,protocol=None,*,fix_imports=True)

     將對象obj保存到文件file中,等同於Pickler(file,protocol).dump(obj)

    參數說明:  

        obj:將要封裝的對象

        protocol:整型,協議版本號,支持的版本號為0到HIGHEST_PROTOCOL,如果沒有指定,默認為DEFAULT_PROTOCOL。如果指定為負數,則為HIGHEST_PROTOCOL。

        file:obj將要寫入的文件對象,file必須以二進制可寫模式打開,即“wb”,該file參數必須有write()方法,該方法能夠接受單字節的參數。

       fix_imports:如果fix_imports為true,並且協議版本小於3,那么pickle將python3對應到python2

  2、pickle.dumps(obj)

      以字節對象形式返回封裝的對象,不需要寫入文件中

  3、pickle.load(file,*,fix_import=True,encoding="ASCII",errors="strict")

    從file中讀取一個字符串,並將它重構為原來的python對象

         file:必須以二進制可讀模式打開,即“rb“,其余為可選參數,有read()和readline()接口

     等同於Unpickler(file).load()

  4、pickle.loads(bites_object)

     從字節對象中讀取被封裝的對象,並返回pickle模塊可能出現的三種異常

   1、 帶可壓縮的Pickle

        Pickle提供了從python程序中保存數據(或向python程序加載數據)的最簡單方法。Pickle沒有安全機制(沒有機密、沒有數字簽名)。之所以有安全問題,是因為pickle可以導入任意模塊並調用任意函數,因此來自不可信源的pickle中的數據可能會被惡意操作。但pickle是處理ad hoc數據的理想選擇,針對個人用途的程序更是如此。

 

pickle.dump(obj,file[,protocol])       

 

        如果要求壓縮,可使用gzip.open()打開文件,否則使用內置的open()函數。

        二進制模式pickling數據時,必須使用“二進制寫”模式(wb)

       錯誤處理選擇的方式:只要發生錯誤立即向用戶報告,並向調用者返回一個布爾值,以表示成功還是失敗。

       finally語句塊確保文件被關閉

import pickle
import gzip
def export_pickle(self,filename,compress=False):
    fh = None
    try:
        if compress:
            fh = gzip.open(filename,"wb")
        else:
            fh = open(filename,"wb")
        pickle.dump(self,fh,pickle.HIGHEST_PROTOCOL)
        return True
    except (EnvironmentError,pickle.PickleError) as err:
        print("{0}:export error:{1}".format(os.path.basename(sys.argv[0]),err))
        return False
    finally:
        if fh is not None:
            fh.close()
            
    

  

2、struct模塊

  在python中,需要處理二進制數據,比如在存取文件、socket通信時,這時可以通過struct模塊來實現,對此,我翻閱了一些很不錯的博客,就不在此班門弄斧。后面會轉載一些來學習。

   struct模塊中,最重要的三個函數:pack(), unpack(), calcsize()。還提供了struct.Struct()類。

   struct.pack():

           參數:一個struct格式化字符串,一個或多個值

           返回:一個bytes對象,其中存放的是按照該格式規范表示的所有這些參數值。

   struct.unpack():

           參數:一個格式化規范,以及一個bytes或bytearray對象

           返回:一個元組,其中的值原本使用該格式規范進行了打包

>>> import struct
>>> data=struct.pack("<2h",11,-9)
>>> data
'\x0b\x00\xf7\xff'
>>> items=struct.unpack("<2h",data)
>>> items
(11, -9)
>>> 

 struct.calcsize():

          參數:以一個數規范為參數

          返回:使用該格式規范的struct所占據的字節數。

格式規范也可以通過創建一個struct.Struct()對象存儲(將該格式規范作為其參數),而struct.Struct()對象的大小則由其size屬性指定。

>>> TWO_SHORTS = struct.Struct("<2h")
>>> data=TWO_SHORTS.pack(11,-9)
>>> items=TWO_SHORTS.unpack(data)
>>> data
'\x0b\x00\xf7\xff'
>>> items
(11, -9)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM