摘要:默認情況下,它也是不安全的,如果數據是由黑客精心設計的,則反序列化的數據可能被植入惡意代碼。總結為我們提供了數據序列化的工具。如果是自己內部使用,可以作為一個選擇進行復雜對象的序列化。
上一節我們學習了文件的讀寫,把一個字符串(或字節對象)保存到磁盤是一件很容易的事情。但是在實際編程中,我們經常需要保存結構化數據,比如復雜的字典、嵌套的列表等等,這時候就需要我們想辦法把這些結構化數據先轉變成一個字符串,這個轉換過程就叫做“序列化”,這一過程的逆操作就是“反序列化”。
JSON序列化序列化數據的操作在各個語言編程中都會遇到,當然也出現了標準化的格式,比如:JSON(JavaScript Object Notation)。JSON格式通常被現代應用程序用于數據交換,尤其是在Web中廣為人知,是許多程序員的選擇。Python支持JSON的模塊叫做json。
JSON的數據格式和Python中的字典和列表非常相似,可以說它是字典和列表相互嵌套的結合體,而這些字典和列表的基本數據類型只能是:字符串、整數、浮點數、布爾型、None,不能是自定義的類等復雜對象。
一個對象x可以用一行簡單的代碼轉換成它對應的JSON字符串:
In [124]: import json In [125]: json.dumps({"Tom": 23, "Jim": 25, "William": 21}) Out[125]: "{"Tom": 23, "Jim": 25, "William": 21}"
把JSON字符串反序列化為Python對象的代碼也只有一行:
In [126]: json.loads("{"Tom": 23, "Jim": 25, "William": 21}") Out[126]: {"Tom": 23, "Jim": 25, "William": 21}
dumps()方法有個變體叫做dump(),它是將對象序列化到文件中。如果f是一個文件對象,我們可以這樣操作:
json.dump(x, f)
對應的,從文件對象f中反序列化的操作就是:
x = json.load(f)
dumps()函數有很多參數可選,使我們生成不同格式的JSON字符串,具體可以在IPython中通過json.dumps?來查看。我們可以通過下面的例子來了解一下:
(1)緊湊編碼
通過separators參數來實現:
In [130]: json.dumps({"Tom": 23, "Jim": 25, "William": 21}, separators=(",", ":")) Out[130]: "{"Tom":23,"Jim":25,"William":21}"
(2)美化輸出
通過sort_keys, indent參數來實現:
In [132]: print(json.dumps({"Tom": 23, "Jim": 25, "9":3, "3": 10}, sort_keys=True, indent=4)) { "3": 10, "9": 3, "Jim": 25, "Tom": 23 }
(3)中文編碼
參數ensure_ascii默認為True,會把中文等非ascii字符轉義:
In [133]: print(json.dumps({"小剛": 23, "小明": 25, "9":3, "3": 10}, sort_keys=True, indent=4)) { "3": 10, "9": 3, "u5c0fu521a": 23, "u5c0fu660e": 25 } In [134]: print(json.dumps({"小剛": 23, "小明": 25, "9":3, "3": 10}, sort_keys=True, indent=4, ensure_ascii=False)) { "3": 10, "9": 3, "小剛": 23, "小明": 25 }pickle模塊序列化
與json模塊不同,pickle可以對任意復雜的Python對象進行序列化,它是Python特有的,不能與其它語言進行通信。默認情況下,它也是不安全的,如果數據是由黑客精心設計的,則反序列化的數據可能被植入惡意代碼。
pickle的接口跟json是一樣的,序列化用dumps(x), dump(x, f),反序列化使用loads(s), load(f)。但是,pickle可以序列化任意復雜的對象,比如自定義的類、函數都是可以用它來序列化的。比如下面這個例子就是序列化b并反序列化一個函數:
In [136]: def add(x, y): ...: print(x+y) ...: In [137]: import pickle In [138]: s = pickle.dumps(add) In [139]: s Out[139]: b"x80x03c__main__ add qx00." In [140]: f = pickle.loads(s) In [141]: f Out[141]:In [142]: f(2, 3) 5
從這個例子中,我們實現了序列化和反序列化一個函數的功能。這樣,我們可以把一些函數、自定義的類等各種對象先序列化到文件,然后把這個文件發給別人,別人可以通過反序列化來使用這些自定義的類和函數。這個過程中,如果有人對序列化文件做了手腳,比如通過修改文件修改了函數add()的實現,就有可能被黑客利用來進行攻擊。這也是前面我們為什么說pickle默認是不安全的。所以,在選擇是否使用它進行序列化時,要先思考一番。
總結Python為我們提供了數據序列化的工具。如果需要和其它程序進行數據交換,json是最好的選擇。如果是自己內部使用,pickle可以作為一個選擇進行復雜對象的序列化。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43810.html
摘要:第二個索引元素不在分片內。顯示操作索引指向第個元素,第個元素不存在。序列加法乘法表示個空列表空列表用初始化成員資格運算符布爾運算符,檢查值是否在序列中。修改列表,沒有返回值。在原位置對列表排序。 序列 例: Edward = [abc, 12] 序列中的所有元素都是有編號的,從0開始遞增。 Note: 使用負數索引-1,Python會從右邊,也就是從最后一個元素開始計數。最后一個元素...
摘要:貢獻者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻者:飛龍版...
摘要:在中,并不是一個內置函數,而是一個類型,但是在中它是一個內置函數上面是中從看到的的說明,它的是,而不像內置函數的是。雖然的類型從中的內置函數變成了中的,但并不影響我們對它的使用。 循環是計算機程序中經常用到的流程。試想一下,如果我們有一萬個數據要處理,每個數據處理的流程都一模一樣,如果我們用順序流程就要把處理流程重復寫一萬遍,是不是很累?而用for循環就簡單多了。 showImg(ht...
摘要:所解包的序列中的元素數量必須和賦值符號左邊的變量數量完全一致。其中,冒號標識語句塊開始塊中每一個語句都是縮進相同量退回到和已經閉合的塊一樣的縮進量時,表示當前塊結束。成員資格運算符字符串和序列比較字符串可按照字母順序比較。 print和import print打印多個表達式,用逗號,隔開 print abc:, 42, nonono #輸出在每個參數之間添加空格 print在結尾處加上...
閱讀 3441·2023-04-25 23:25
閱讀 2069·2021-11-12 10:36
閱讀 2816·2019-08-30 12:47
閱讀 2037·2019-08-29 18:45
閱讀 435·2019-08-29 17:28
閱讀 1785·2019-08-29 17:15
閱讀 1707·2019-08-29 16:05
閱讀 1405·2019-08-29 14:17