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