内置模块之json模块、pickle模块
内置模块之json模块、pickle模块
json模块
json在编程语言中拥有重要的地位,它可以将数据类型存储为文本格式,也可以沟通每个语言中共有的数据类型。json模块就是帮助我们将python文件的数据类型和json数据类型相互转换的模块。
除了python中的数据可以转换成json,其他的编程语言如c、如js、如java都可以将其所独有的数据类型转换为json格式,这个过程叫做序列化,而将json格式的文件再变回python数据或者其他编程语言对应的数据的过程叫做反序列化。
注:json格式实际上是有特定格式的字符串
序列化
dumps()
import json
d1 = {'name': 'leethon', 'age': 18, 'hobby': ['eat', 'sleep']}
with open(r'a.txt', 'w', encoding='utf8') as f:
res = json.dumps(d1) # 序列化
f.write(res) # 将序列化的文本写进文件
dump()
import json
d1 = {'name': 'leethon', 'age': 18, 'hobby': ['eat', 'sleep']}
with open(r'a.txt', 'w', encoding='utf8') as f:
json.dump(d1, f) # 两步化作一步,参数为要变换的数据及文件类型数据
反序列化
loads()
import json
with open(r'a.txt', 'r', encoding='utf8') as f:
res = f.read() # 读取文件所有文本
print(json.loads(res)) # 将文本反序列化得到python的数据--字典
# {'name': 'leethon', 'age': 18, 'hobby': ['eat', 'sleep']}
load()
import json
with open(r'a.txt', 'r', encoding='utf8') as f:
print(json.load(f)) # 两步做一步,参数为文件类型,直接将文件中的文本反序列化作返回值
json实战练习
本题涉及os模块的内容,读者可去另一篇博客自行查阅。
要求:用json文件存储用户字典,以实现用户注册和登录功能。
用户字典模板:
user_dict = {
'username': 'leethon',
'password': '123',
'account': 15000, # 账户余额
'shop_car': [] # 购物车
}
以下为参考:
import json
import os
ROOT_PATH = os.path.dirname(__file__)
DB_PATH = os.path.join(ROOT_PATH, 'db')
def register():
while True:
# 判断是否有db文件夹,没有的话,创建一个
if not DB_PATH:
os.mkdir(DB_PATH)
# 要求用户输入
username = input('请输入用户名:')
# 拼接用户文件路径
user_path = os.path.join(DB_PATH, f'{username}.json')
# 判断用户是否注册过了
if os.path.isfile(user_path):
print('该用户名已经被注册了,请输入其他用户名')
continue
# 如果没注册,输入密码进行用户创建
password = input('请输入密码:')
user_dict = {
'username': username,
'password': password,
'account': 15000, # 默认注册就有15000的余额
'shop_car': [] # 购物车
}
# 将用户字典存到json文件中
with open(user_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f)
print('注册成功')
break
def login():
while True:
# 要求用户输入用户名密码
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
user_path = os.path.join(DB_PATH, f'{username}.json')
# 判断用户是否存在和密码是否正确
if not os.path.isfile(user_path):
print('用户不存在')
continue
# 读取用户文件
with open(user_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
if user_dict.get('password') == password:
print('登录成功!')
break
else:
print('密码错误!')
register()
login()
练习
简单的实现一个统计指定文件类型的脚本工具
输入指定类型的文件后缀
eg:.txt
并给出一个具体路径 之后统计该类型文件在该文件下的个数
import os.path
file_class = input('输入一种文件类型(后缀如txt):').strip()
dir_path = input('你要检查的文件目录:').strip()
count = 0
for file in os.listdir(dir_path):
if file.endswith(file_class):
count += 1
print(count)
pickle模块
pickle序列化模块,可以兼容所有的python数据类型,将之序列化和反序列化,这样就可以将我们的对象数据存到文件里了。
但是同时也有缺陷,就是只能在python语言中使用,无法想json一样作为各语言连接的工具。
总之,这个模块能帮助我们序列化并存储对象到文件和读出文件中的内容反序列化为对象数据。
class C1:
def __init__(self, name, age):
self.name = name
self.age = age
def func1(self):
print('from func1')
def func2(self):
print('from func2')
obj = C1('leethon', 18)
with open(r'a.txt', 'wb') as f: # 只能按二进制存储pickle的序列化数据
pickle.dump(obj, f)
with open(r'a.txt','rb') as f: # 只能按二进制读出
data = pickle.load(f)
print(data)
data.func1()
data.func2()