json可以处理的数据格式:ture、false、null、 字典、元组、列表和数值,元组序列化时会被强制转换成列表格式
json.load(文件句柄):把文件中的json格式数据转换成原有格式时使用
注意:dumps和loads都是直接和内存打交道,dump和load直接和文件打交道。
import json
list = [1,3,4,5,654,'dsf']
str_list = json.dumps(list)
# 序列化
print([str_list], type(str_list))
list1 = json.loads(str_list)
# 反序列化
print(list1)
with open('json_dump', mode='w') as f:
json.dump(list, f)
# json写入文件
with open('../第三方库/json_dump', mode='r') as f:
print(json.load(f))
# 反序列化读取文件
dict = {1:2,3:4,5:6}
str_dict = json.dumps(dict)
print(str_dict)
new_dict = json.loads(str_dict)
print(new_dict)
'''
结果是:
['[1, 3, 4, 5, 654, "dsf"]'] <class 'str'>
[1, 3, 4, 5, 654, 'dsf']
[1, 3, 4, 5, 654, 'dsf']
{"1": 2, "3": 4, "5": 6}
# key值直接加上了双引号
{'1': 2, '3': 4, '5': 6}
# 转换回来的key也加上了单引号
'''
dict = {1:2,3:4,5:6}
str_dict = json.dumps(dict)
print(str_dict)
new_dict = json.loads(str_dict)
print(new_dict)
dict1 = {'key': (1,2,3)}
str_dict1 = json.dumps(dict1)
print(str_dict1)
new_dict1 = json.loads(str_dict1)
print(new_dict1)
dict2 = {(1,2,3):'key'}
str_dict2 = json.dumps(dict2)
print(str_dict2)
'''
结果是:
{"1": 2, "3": 4, "5": 6}
{'1': 2, '3': 4, '5': 6}
{"key": [1, 2, 3]}
# 序列化时元组被强行转换成列表类型
{'key': [1, 2, 3]}
# json反序列化后元组依然被转换成列表形式
TypeError: keys must be str, int, float, bool or None, not tuple
# value在json转换序列化时不能作为字典的key使用
'''
lst1 = ['12',2, 3, (1,2,3), 2.3]
dic1 = {'name': 'alex', 'age': 20}
set1 = {1,2,3,4}
num = 12343
with open('../第三方库/json_dump', mode='w') as f:
str_lst1 = json.dumps(lst1)
str_dic1 = json.dumps(dic1)
str_num = json.dumps(num)
total_str = str_lst1 + '\n' + str_dic1 + '\n' + str_num
f.write(total_str)
with open('../第三方库/json_dump', mode='r') as f:
for line in f:
result = json.loads(line)
print(result)
'''
结果是:
['12', 2, 3, [1, 2, 3], 2.3]
{'name': 'alex', 'age': 20}
12343
'''
'''序列化时的中文转换问题'''
dict1 = {'name': 'alex', 'country': '中国'}
str_dict1 = json.dumps(dict1)
print(str_dict1)
# 当序列化时如果不设置,中文默认会被转换成unicode编码格式
str_dict2 = json.dumps(dict1, ensure_ascii=False)
print(str_dict2)
# 设置ensure_ascii=False序列化后中文依然显示
new_dict1 = json.loads(str_dict1)
print(new_dict1)
new_dict2 = json.loads(str_dict2)
print(new_dict2)
# 无论是否显示,反序列化时中文都会正常显示
with open('../第三方库/json_dump', 'a', encoding='utf-8') as f:
json.dump(dict1, f, ensure_ascii=False)
'''
结果是:
{"name": "alex", "country": "\u4e2d\u56fd"}
{"name": "alex", "country": "中国"}
{'name': 'alex', 'country': '中国'}
{'name': 'alex', 'country': '中国'}
'''
dict1 = {'name': 'alex', 'country': '中国', 'hobby': ['篮球', '足球', '健身', '劈叉']}
new_dict3 = json.dumps(dict1, ensure_ascii=False, indent=2, separators=(',', ':'), sort_keys=True)
print(new_dict3)
'''
结果是:
{
"country":"中国",
"hobby":[
"篮球",
"足球",
"健身",
"劈叉"
],
"name":"alex"
}
'''
pickle在序列化和反序列化的时候不会对原有的数据类型进行转换,保留原有的格式,而json会在序列化时对格式进行转换,
而在反序列化是部分原有的数据如元组已经被永久的转换成了列表格式
'''pickle模块'''
import pickle
class Student:
COUNTRY = '中国'
def __init__(self, name, age):
self.name = name
self.age = age
s1 = Student('维维', 20)
s2 = Student('布布', 40)
s3 = Student('尔尔', 30)
s4 = Student('什什', 28)
pickle_s1 = pickle.dumps(s1)
print(pickle_s1)
# pickle可以对类的对象进行序列化操作,但是json不能对对象进行序列化操作
# with open('../第三方库/pickle_dump', 'wb') as f:
# pickle.dump(s2, f)
# pickle.dump(s3, f)
# pickle.dump(s4, f)
with open('../第三方库/pickle_dump', 'rb') as f:
for i in range(3):
# pickle读取多个数据的时候需要用range,json直接遍历句柄f
obj = pickle.load(f)
print(obj)
print(obj.name)
'''
b'\x80\x03c__main__\nStudent\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x06\x00
\x00\x00\xe7\xbb\xb4\xe7\xbb\xb4q\x04X\x03\x00\x00\x00ageq\x05K\x14ub.'
<__main__.Student object at 0x110147c10>
布布
<__main__.Student object at 0x11015be90>
尔尔
<__main__.Student object at 0x110147810>
什什
'''
python3对shelve的模块的支持不是很好。
'''shelve模块'''
import shelve
f = shelve.open('shelve_demo')
f['key'] = {'k1': 'v1', 'k2': (1,2,3), 'k3': ['sd', 'as', 'sd']}
f['k1'] = [1,2,3,4,5]
f.close()
f = shelve.open('shelve_demo')
content = f['key']
content1 = f['k1']
print(content, content1)
'''
{'k1': 'v1', 'k2': (1, 2, 3), 'k3': ['sd', 'as', 'sd']} [1, 2, 3, 4, 5]
'''
原文:https://www.cnblogs.com/ddzc/p/12310788.html