python文件處理--筆記

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

《Python3程序開發指南》安全

一、二進制數據的讀寫socket

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

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

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

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

  pickle模塊提供的常量:對象

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

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

pickle模塊提供的函數:

  一、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

  二、pickle.dumps(obj)

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

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

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

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

     等同於Unpickler(file).load()

  四、pickle.loads(bites_object)

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

   一、 帶可壓縮的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()
            
    

  

二、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)
相關文章
相關標籤/搜索