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