我們平常使用的python物件所進行的操作是在記憶體中,當程式關閉就會被清空,所以我們需要用一種合適的方法將這些資料儲存下來。
為了將我們的資料進行永久儲存,需要引入序列化(pickling/serialization)的概念。
序列化的定義:將複雜的python資料結果轉換成乙個二進位制資料集合(資料流)。反序列化:從資料流(字串形式)重新構造複雜的python資料結構。
序列化的好處:我們可以通過網路或本地儲存介質講這些資料流儲存或傳輸。
序列化的方法:引入json、pickling、marshal、shelve
,其中最常用的是json。
2.1 基本用法
json模組的序列化和反序列化方法分別是dumps和loads,json.dumps
()和json.dump()
將乙個python物件轉換成json串,json.loads
()和json.load()
將乙個json串還原成python物件。
json.dump()和json.dumps()的區別
json.dump()
處理的是檔案物件,而json.dumps()
處理的是字串物件。
json.load()和json.loads()的區別
json.load()
處理的是檔案物件,而json.loads()
處理的是字串物件。
2.2 json.dumps()
將python的資料型別轉換成json字串
語法格式:json.dumps(obj, skipkeys=false, ensure_ascii=true, check_circular=true, allow_nan=true, cls=none, indent=none, separators=none, encoding="utf-8", default=none, sort_keys=false, **kw)
>>
>
import json
>>
> json.dumps(
)''>>
> json.dumps(
"string"
)'"string"'
>>
> json.dumps(1)
'1'>>
> json.dumps(
)''
使用引數能讓json字串格式化輸出:
>>
>
print json.dumps(
, sort_keys=
true
, indent=
4, separators=
(','
,': '))
較重要的引數:
sort_keys:是否排序
indent:定義縮排大小
separators:是乙個元組,定義分隔符的型別
skipkeys:是否允許json字串編碼字典物件時,字典的key不是字串型別(預設是不允許)
a =
['foo',]
s = json.dumps(a, sort_keys=
true
, indent=
4, separators=
('!'
,'?'))
#分隔符這裡只是測試,一般保持預設逗號和分號即可
print s
result:
["foo"!
]
try
: data =
json.dumps(data)
except typeerror,e:
print e #keys must be a string
print json.dumps(data,skipkeys=
true)#
data =
print json.dumps(data)
result:
keys must be a string
python原始型別向json型別的轉化對照表
python
json
dict
object
list,tuple
array
str,unicode
string
int,long,float
number
true
true
false
false
none
null
2.3 json.loads()
將json字串轉換成python的資料型別。也就是反序列化。
語法格式:json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
json.loads('')
json字串轉換成python物件型別對照表
json
python
object
dict
array
list
string
unicode
number(int)
intnumber(real)
float
true
true
false
false
null
2.4 json.dump()
將序列化之後形成的json字串儲存到檔案。
語法格式:dump(obj, fp, skipkeys=false, ensure_ascii=true, check_circular=true, allow_nan=true, cls=none, indent=none, separators=none, default=none, sort_keys=false, **kw):
#encoding:utf-8
import json
a=#第一種方法將json字串寫入檔案中
#該方法不需要close
with
open
("json.txt"
,"a"
)as f:
f.write(json.dumps(a,indent=4)
)#第二種方法將json字串寫入檔案中
f=open
("json.txt"
,"a"
)json.dump(a,f,indent=4)
f.close(
)#json.txt
2.5 json.load()
從檔案接受json字串,並反序列化成為python的資料型別。
語法格式:load(fp, cls=none, object_hook=none, parse_float=none, parse_int=none, parse_constant=none, object_pairs_hook=none, **kw)
#encoding:utf-8
import json
a=#第一種方法將json字串寫入檔案中
#該方法不需要close
with
open
("json"
,"a"
)as f:
f.write(json.dumps(a)
)#第一種方法將檔案中的json字串轉反序列化成python的資料型別
with
open
("json"
,"r"
)as f:
print json.loads(f.read())
#json
python的json想辦法能將各種資料物件都轉換為json,其中可選引數default就是用來提供給使用者自行定義轉換函式的
class
student
(object):
def__init__
(self,name,***,age)
: self.name=name
self.***=***
self.age=age
tyson=student(
"tyson"
,"boy",21
)print json.dumps(tyson,default=
lambda obj:obj.__dict__)
#python的json想辦法能將各種資料物件都轉換為json,其中可選引數default就是用來提供給使用者自行定義轉換函式的
#所以上面的方法與下面這個是等同的
defstuclass2json
(classobject)
:return
print json.dumps(tyson,default=stuclass2json)
一般不會遇到這種情況,待新增 標準庫之JSON物件
json格式 每個json物件就是乙個值,可能是乙個陣列或物件,也可能是乙個原始型別的值,只能是乙個值,不能是兩個或更多的值.json 對值的型別和格式有嚴格的規定 復合型別的值只能是陣列或者物件,不能是函式 正規表示式物件 日期物件.原始型別的值只有四種 字串 數值 十進位制 布林值和null,不...
Python常用標準庫 json
json是一種輕量級資料交換格式,一般api返回的資料大多是json xml,如果返回json的話,將獲取的資料轉換成字典,方面在程式中處理。json庫經常用的有兩種方法dumps和loads 將字典轉換為json字串 dict type dict json str json.dumps dict ...
Python序列化之Json基礎
python的序列化就是將python的基本物件轉換為字串的過程,反之則是反序列化。序列化型別 import json import pickle 序列化定義 序列化 物件 列表 字典都是python的基本資料型別,序列化其實就是把這些資料型別轉換為字串。反序列化 將序列化後得到的字串轉反序列化成p...