zoukankan      html  css  js  c++  java
  • 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("请输入正确的编号:")
  • 相关阅读:
    JSP前三章测试改错
    实现文件上传
    Url和Uri的区别
    四套读写文件方案
    C++第一课
    数据聚合架构模式
    高并发怎么解决?
    为什么做不了软件架构师
    完整版go-mysql-elasticsearch安装步骤
    安装GO
  • 原文地址:https://www.cnblogs.com/cheng10/p/13497860.html
Copyright © 2011-2022 走看看