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("请输入正确的编号:")

 

posted @ 2020-08-13 17:53  橙子皮!  阅读(416)  评论(0编辑  收藏  举报