辨别 Python 中 load 和 loads 的小技巧
?
?
load 和 loads 都是實(shí)現(xiàn)“反序列化”,load 通過 json.load(open('*.json')) 這樣的格式,從文件句柄中打開文件,加載到Python的變量中,并以字典的格式轉(zhuǎn)換。而 loads 必須對于 Python內(nèi)存中的序列化對象轉(zhuǎn)換成字符串。
load 和 loads 都是實(shí)現(xiàn) “反序列化”,區(qū)別在于(以Python為例):
-
loads 針對 內(nèi)存對象,即將 Python內(nèi)置數(shù)據(jù)序列化為字串。如使用json.dumps序列化的對象d_json=json.dumps({'a':1, 'b':2}),在這里 d_json 是一個字串'{"b": 2, "a": 1}',d=json.loads(d_json) ?#{?b": 2, "a": 1},使用load重新反序列化為dict
-
load 針對?文件句柄。如本地有一個 json 文件 a.json 則可以 d=json.load(open('a.json')),相應(yīng)的,dump 就是將內(nèi)置類型序列化為 json 對象后寫入文件
?
測試 ( 使用 loads )
list_1 = '[1,2,3,4]' dict_1 = '{"k1":"v1"}' print(type(list_1)) # <class 'str'> print(type(dict_1)) # <class 'str'>ret = json.loads(list_1) print(ret, type(ret))ret = json.loads(dict_1) print(ret, type(ret))# 輸出 # [1, 2, 3, 4] <class 'list'> # {'k1': 'v1'} <class 'dict'>?
測試( 使用 load ):
# -*- coding: utf-8 -*- # @Time : # @Author : # @Email : # @File : parse_cinema_info.py # @Software: PyCharmimport jsondef parse_cinema_info():cinema_info_dict = json.load(open('f:/bj_cinema_all_info.json', "rb"))all_cinemas = cinema_info_dict['cinemas']cinemas_list = list()for cinema in all_cinemas:d = dict(cinema_id=cinema['id'],cinema_name=cinema['nm'],city='北京',address=cinema['addr'],telephone=None)cinemas_list.append(d)with open('f:/bj_cinema.json', 'w') as f:json.dump(cinemas_list,f, ensure_ascii=False, indent=4)passif __name__ == '__main__':parse_cinema_info()pass使用 dump:
# -*- coding: utf-8 -*- # @Time : # @Author : # @Email : # @File : parse_cinema_hall_info.py # @Software: PyCharmimport re import jsondef parse_file():cinema_hall_info = dict()with open('f:/pipelines.log', 'rb') as f:all_lines = f.readlines()for line in all_lines:line_str = line.decode('utf-8')base_time_info = re.findall("\('.*?'\)", line_str)if base_time_info:hall_info_list = list()for base_time in base_time_info:t = tuple(eval(base_time))cinema_id, hall_info = t[1], t[8]if hall_info not in hall_info_list:hall_info_list.append(hall_info)cinema_hall_info[cinema_id] = hall_info_listelse:# print(json.dumps(cinema_hall_info, ensure_ascii=False))hall_info_list = list()for cinema in cinema_hall_info:# print('cinema_id : {0} hall_info : {1}'.format(cinema, cinema_hall_info[cinema]))d = dict(cinema_id=cinema,hall_info=cinema_hall_info[cinema],seat_count=None)hall_info_list.append(d)else:with open('f:/bj_cinema_hall.json', 'w') as f:json.dump(hall_info_list, f, ensure_ascii=False, indent=4)if __name__ == '__main__':parse_file()pass一個測試 json 文件 (bj_cinema_all_info.json):
{"cinemas": [{"id": 264,"mark": 0,"nm": "萬達(dá)國際影城(CBD店)","sellPrice": "48.5","addr": "朝陽區(qū)建國路93號萬達(dá)廣場B座3層","distance": "600m","tag": {"allowRefund": 0,"buyout": 0,"cityCardTag": 0,"deal": 0,"endorse": 0,"hallType": ["IMAX廳","RealD 6FL廳","4DX廳"],"hallTypeVOList": [{"name": "IMAX廳","url": ""},{"name": "RealD 6FL廳","url": ""},{"name": "4DX廳","url": ""}],"sell": 1,"snack": 1,"vipTag": "折扣卡"},"promotion": {}},{"id": 23,"mark": 0,"nm": "百麗宮影城(國貿(mào)店)","sellPrice": "29","addr": "朝陽區(qū)建國門外大街1號國貿(mào)商城北區(qū)B1層B120","distance": "1km","tag": {"allowRefund": 0,"buyout": 0,"cityCardTag": 0,"deal": 0,"endorse": 0,"hallType": ["RealD廳"],"hallTypeVOList": [{"name": "RealD廳","url": ""}],"sell": 1,"snack": 1},"promotion": {}}],"ct_pois": [{"ct_poi": "936879945111165696_a15272_c223","poiid": 99082156},{"ct_poi": "936879945111165696_a2378_c224","poiid": 1541434},{"ct_poi": "936879945111165696_a15748_c225","poiid": 94728699}],"paging": {"hasMore": false,"limit": 10000,"offset": 0,"total": 226} }?
?
?
總結(jié)
以上是生活随笔為你收集整理的辨别 Python 中 load 和 loads 的小技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用层(知识架构图)
- 下一篇: CompletableFuture详解~