python序列化數據


在python中序列化數據可以使用兩種不同模塊,一種是json格式,另一種是pickle模塊!

序列化的概念:

序列化:將對象的狀態信息轉換為可以存儲或可以通過網絡傳輸的過程,傳輸的格式可以是JSON,XML等。

反序列化就是從存儲區域(JSON,XML)讀取反序列化對象的狀態,重新創建該對象。

JSON模塊

json是一種在各個通用的格式,因此可以跨語言之間的去傳遞數據。

json:一種輕量級數據交互格式,相對於XML而言更簡單,也易於閱讀和編寫,機器也方便解析和生成,json是javascript的一個子集。

python的json模塊序列化與反序列化的過程分別是encoding和decoding。

  • encoding:把一個python對象編碼轉換成Json字符串,對應的方法是load和loads。
  • decoding:把json格式字符串編碼轉換成python對象,對應的方法是dump和dumps。

json模塊提供了四個方法:dump , load, dumps, loads

json的dumps方法與loads方法:dumps把python對象格式化為json字符串保存在變量中,loads方法把json字符串反序列化為python對象。

# dumps功能
# 將數據通過特殊的形式轉換為所有程序語言都認識的字符串
In [2]: data = ["a","bb","ccc"]

In [3]: j_data = json.dumps(data)

In [4]: j_data
Out[4]: '["a", "bb", "ccc"]'

In [5]: type(j_data)
Out[5]: str

# loads功能
# 將json編碼的字符串再轉換為python的數據結構
In [6]: meg = json.loads(j_data)

In [7]: meg
Out[7]: [u'a', u'bb', u'ccc']

In [8]: type(meg)
Out[8]: list

dump與load的功能與上面的一樣,只不過是把數據保存在文件中。

 # dump功能
 # 將數據通過特殊的形式轉換為所有程序語言都認識的字符串,並寫入文件
 In [11]: with open("/tmp/tmp.json","wr") as fd:
   ....:     json.dump(data,fd)
   ....: 
[root@db2 tmp]# cat tmp.json 
["a", "bb", "ccc"]
[root@db2 tmp]#

# load功能
# 從數據文件中讀取數據,並將json編碼的字符串轉換為python的數據結構
In [1]: import json

In [2]: fd = open("/tmp/tmp.json","r")

In [3]: data = json.load(fd)

In [4]: data
Out[4]: [u'a', u'b', u'c']  #注意編碼格式

對於字典,json會假設key是字符串(字典中的任何非字符串key都會在編碼時轉換為字符串),要符合JSON規范,應該只對python列表和字典進行編碼。此外,在WEB應用中,把最頂層對象定義為字典是一種標准做法。
json編碼的格式幾乎和python語法一致,略有不同的是:True會被映射為true,False會被映射為false,None會被映射為null,元組()會被映射為列表[],因為其他語言沒有元組的概念,只有數組,也就是列表。

一些參數使用(摘錄):

  • ensure_ascii 默認為True,保證轉換后的json字符串中全部是ascii字符,非ascii字符都會被轉義。如果數據中存在中文或其他非ascii字符,最好將ensure_ascii設置為False,保證輸出結果正常。
  • indent 縮進,默認為None,沒有縮進,設置為正整數時,輸出的格式將按照indent指定的半角空格數縮進,相當實用。
  • separators 設置分隔符,默認的分隔符是(',', ': '),如果需要自定義json中的分隔符,例如調整冒號前后的空格數,可以按照(item_separator, key_separator)的形式設置。
  • sort_keys 默認為False,設為True時,輸出結果將按照字典中的key排序。
data
Out[23]: {'a': True, 'b': False, 'c': None, 'd': (1, 2), 1: 'abc', 'cn': ['中國-北京']}

jdata1 = json.dumps(data)  #使用默認參數

print(jdata1)
{"a": true, "b": false, "c": null, "d": [1, 2], "1": "abc", "cn": ["\u4e2d\u56fd-\u5317\u4eac"]}

jdata2 = json.dumps(data,ensure_ascii=False, indent=4) #修改參數

print(jdata2)
{
    "a": true,
    "b": false,
    "c": null,
    "d": [
        1,
        2
    ],
    "1": "abc",
    "cn": [
        "中國-北京"
    ]
}

pickle模塊的使用

json模塊是各種編程語言通用的數據格式,pickle是python自帶的序列化格式。

在python2中有pickle和cpickle兩個模塊,在python3中只有pickle一個模塊。

pickle對應的也有四個方法和dump和load, dumps和loads。

In [1]: l1 = [1,2,3]

In [2]: l2 = ["a","c","d"]

In [3]: l3 = {1:"a", 2:"c", 3:"d"}

In [5]: fd = open("pickle.kpi", "a")  

In [6]: import pickle  #按順序把三個列表序列化到文件中

In [8]: pickle.dump(l1,fd)

In [9]: pickle.dump(l2,fd)

In [10]: pickle.dump(l3,fd)

In [11]: fd.close()

In [12]: fd = open("pickle.kpi", "r") 

In [13]: s1 = pickle.load(fd)  #注意反序列化時,讀出列表的順序,遵循先進先出的原則

In [14]: s1
Out[14]: [1, 2, 3]

In [16]: s2 = pickle.load(fd)

In [17]: s2
Out[17]: ['a', 'c', 'd']

In [19]: s3 = pickle.load(fd)

In [20]: s3
Out[20]: {1: 'a', 2: 'c', 3: 'd'}

 


免責聲明!

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



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