python-with关键字,json,pickie序列化与反序列化
'''
with关键字的使用
与外界资源交互时 需要手动关闭通道
with 语句用于建立通道,当操作完毕之后 无需手动关闭通道 会自动关闭
格式
with open(...) as 变量,open(...) as变量2 ...:
与外界资源进行交互
#实现文件拷贝
在操作文件的时候 本质上是操作的文件内容
文件拷贝:
在源文件的位置 拷贝一下文件内容
在目的处 创建一个新文件 吧文件添加到文件中
用代码实现文件中读取数据
先源文件中读取数据
讲读到的数据写入到文件中
'''
复制图片为例
1 import os 2 src_path = r'..\下载.jpg' 3 file_name = os.path.basename(src_path) 4 print(file_name) 5 6 #根据这个名字设置目的文件位置 7 dest_path = os.path.join('.',file_name) 8 print(dest_path) 9 10 try: 11 #读写操作 12 with open(src_path,'rb') as r_handle, open(dest_path,'wb') as w_handle: 13 #先读后写 14 data = r_handle.read() 15 #讲读出的数据写入到指定文件中 16 w_handle.write(data) 17 w_handle.flush() 18 except Exception as e: 19 print(f'异常信息{e}')
'''
序列化:
将对象进行存储,文件操作,可以把字符串或者字节数据写入到文件中,
或者从文件中读取出来,但是对于其他类型的对象,就没有办法将其写入文件中
如果将这个对象写入到文件中就需要序列化,才可以写入到文件里
反序列化:
将对象转化为字节数据,将数据存储到文件中,这个就是序列化
将文件中的字节数据恢复至对象数据,这就是反序列化
区别:
跟字节存储字符串的区别:
直接操作字符串,字节数据的话 数据在文件中是可以看懂的
系列化到文件中的数据时看不懂的
'''
'''
python中提供JSON 和pickie两个模块来实现数据中的序列化和反序列化
pickie模块序列化
提供dump /dumps方法可以把对象序列化
load/loads 将数据进行反序列化
'''
1 import pickle 2 3 #创建pickle.txt文件 4 with open('pickle.txt','wb') as handle: 5 #dump传递数据,可以将任意类型数据进行系列化 6 pickle.dump("你好",handle) 7 pickle.dump(10,handle) 8 #存储列表 9 pickle.dump(['啦啦','哈哈'],handle) 10 11 #dumps序列化对象,不能把对象写入到文件中 12 score_dict ={"语文:33"} 13 bytes_data =pickle.dumps(score_dict)#有返回值,转化为字节数据 14 #存储到文件中 15 handle.write(bytes_data) 16 handle.flush()
'''
dump:
可以直接通过文件吧字节数据写入到文件中
dumps:
只是将数据转化为对应的字节数据
如果想写的话 还需要调用write方法
'''
1 with open('pickle.txt','rb') as r_hanble: 2 #load 将数据从文件中读取出来 经过几次写入 就经过几次读取就能读取到对应的数据 3 data =pickle.load(r_hanble) 4 5 #loads 6 score = {"语文":55,"数学":22} 7 by_data =pickle.dumps(score) 8 data =pickle.loads(by_data)#dumps 对应的 从dumps转化的字节数据中提取数据信息 9 print(data)#{'语文': 55, '数学': 22} 10
举例说明
1 ''' 2 用户管理系统 3 注册用户的行为 4 用户名不可重复 5 ''' 6 import pickle,os 7 class User(): 8 def __init__(self,username,paw): 9 self.username =username 10 self.paw =paw 11 12 #设置使用用户对象时的展示信息格式 13 def __str__(self): 14 return f'User(username={self.username},paw={self.paw})' 15 __repr__ =__str__ 16 17 class UserManager(): 18 def __init__(self): 19 #用户列表 存储注册用户 20 # self.user_list =[] 21 # print(f'起始列表:{self.user_list}') 22 #用户列表 存储注册的用户 如果用户文件不存在 获取是 文件的打消为0 使用的是新列表 否则 应该在文件中 23 #把之前的数据读取出来 24 self.__load_users() 25 print(self.user_list) 26 def __load_users(self): 27 if os.path.exists("user.txt") and os.path.getsize("user.txt") != 0: 28 #从文件中加载数据 29 with open('user.txt','rb') as handle: 30 self.user_list = pickle.load(handle) 31 else: 32 #之前没有存数据 33 self.user_list = [] 34 35 36 37 def register(self): 38 usernames =[user.username for user in self.user_list] 39 #用户名不可重复 40 while True: 41 name = input("请输入用户名:") 42 if name in usernames: 43 print('用户名已存在,请从新输入') 44 else: 45 break 46 #用户不存在 使用该用户名 47 48 psw = input("请输入密码:") 49 50 #根据信息创建对象 51 user =User(name,psw) 52 self.user_list.append(user) 53 print('用户注册成功') 54 print(self.user_list) 55 #将数据进行存储 56 self.__save_users() 57 58 def __save_users(self): 59 with open('user.txt','wb') as handle: 60 pickle.dump(self.user_list,handle) 61 62 63 64 if __name__ == '__main__': 65 manager = UserManager() 66 while True: 67 print(''' 68 欢迎进入用户管理系统 69 1为注册用户 70 2为退出用户 71 ''') 72 pos = input('请输入对应的操作编号:') 73 if pos == '0': 74 break 75 elif pos == '1': 76 manager.register() 77 else: 78 print("请输入正确的编号:")
1 import json,os 2 3 class UserDecoder(json.JSONDecoder): 4 def __init__(self): 5 #设置一个转换规则的方法 6 super().__init__(object_hook=self.dict_object) 7 8 #自定义一下转换规则的方法 9 def dict_object(self,d): 10 #接受对象对应的字典 11 #{'__class__': 'User', '__module__': '__main__', 'username': '11', 'paw': '11'} 12 #从这个字典中提取信息创建对象 13 #获取对象类型所在的模块 14 user_module = __import__(d.get('__module__')) 15 #根据模块和字符串格式的类名 获取 类型 16 user_class = getattr(user_module,d.get('__class__')) 17 #根据类和对象的特征信息 创建对象 18 user = user_class(d.get("username"),d.get("psw")) 19 return user 20 21 class UserEncoder (json.JSONEncoder): 22 def default(self, o): 23 #TypeError: Object of type User is not JSON serializable进行转换 24 #o 表示要进行JSON转换的User对象 25 #指定转换的格式 对象转换的话是有很多信息要转换的 26 #将信息转换为字典 27 user_dict = {} 28 #获取对象的类型的 字符串名字 29 user_dict["__class__"] = o.__class__.__name__ 30 #获取对象对应类型 所在的模块的 字符串格式的名字 31 user_dict["__module__"] = o.__module__ 32 #在追加上对象的信息 对象.__dict__这个字段是以字典形式展示对象的属性信息的 33 user_dict.update(o.__dict__) 34 return user_dict 35 36 37 class User(): 38 def __init__(self,username,paw): 39 self.username =username 40 self.paw =paw 41 42 #设置使用用户对象时的展示信息格式 43 def __str__(self): 44 return f'User(username={self.username},paw={self.paw})' 45 __repr__ =__str__ 46 47 class UserManager(): 48 def __init__(self): 49 #用户列表 存储注册用户 50 # self.user_list =[] 51 # print(f'起始列表:{self.user_list}') 52 #用户列表 存储注册的用户 如果用户文件不存在 获取是 文件的打消为0 使用的是新列表 否则 应该在文件中 53 #把之前的数据读取出来 54 self.__load_users() 55 print(self.user_list) 56 def __load_users(self): 57 if os.path.exists("json_user.txt") and os.path.getsize("json_user.txt") != 0: 58 #从文件中加载数据 59 with open('json_user.txt','r') as handle: 60 #指定从JSON数据多python的user对象的解码规则类 61 self.user_list = json.load(handle,cls=UserDecoder) 62 else: 63 #之前没有存数据 64 self.user_list = [] 65 66 67 68 def register(self): 69 usernames =[user.username for user in self.user_list] 70 #用户名不可重复 71 while True: 72 name = input("请输入用户名:") 73 if name in usernames: 74 print('用户名已存在,请从新输入') 75 else: 76 break 77 #用户不存在 使用该用户名 78 79 psw = input("请输入密码:") 80 81 #根据信息创建对象 82 user =User(name,psw) 83 self.user_list.append(user) 84 print('用户注册成功') 85 print(self.user_list) 86 #将数据进行存储 87 self.__save_users() 88 89 def __save_users(self): 90 with open('json_user.txt','w') as handle: 91 #指定进行json 序列化时 user对象的转换的格式 92 json.dump(self.user_list,handle,cls=UserEncoder) 93 94 95 96 if __name__ == '__main__': 97 manager = UserManager() 98 while True: 99 print(''' 100 欢迎进入用户管理系统 101 1为注册用户 102 2为退出用户 103 ''') 104 pos = input('请输入对应的操作编号:') 105 if pos == '0': 106 break 107 elif pos == '1': 108 manager.register() 109 else: 110 print("请输入正确的编号:")