python学习day16 模块
Posted afly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习day16 模块相关的知识,希望对你有一定的参考价值。
‘‘‘ 模块:包含了python定义和声明的文件,一个py文件就是一个模块 1,内置模块 python解释器自带的模块 2,扩展模块 前辈大牛编写的模块,需要下载使用 3,自定义模块 自己写的模块 *****序列化模块 json pickle shelve json可用于不同语言的数据类型序列化为字符串,支持str,list,dict,bool这些数据类型 pickle只可用于python语言,支持所有python数据类型序列化为字符串,我们可以把对象也当做数据类型是所属类的数据类型 shelve也只可用于python,类似字典的操作,可将数据类型作为字典的键保存到文件中 ‘‘‘ # json dumps()/loads() dump()/load() # dumps(数据类型如字典)/loads(序列化的字符串) dump(数据类型,文件句柄)/load(文件句柄) import json dic = {"name":"alex","age":18} ret = json.dumps(dic,ensure_ascii=False) # 将字典转化为序列化的字符串,增加ensure_ascii参数可以使字符串中的中文显示 dic2 = json.loads(ret) # 将序列化的字符串转化回原数据类型 import json dic = {"name":"alex","age":18} with open("json_file",encoding=‘utf-8‘,mode=‘w‘) as f1: json.dump(dic,f1) # 将字典转化为序列化的字符串并保存在文件中 with open("json_file",encoding=‘utf-8‘) as f2: print(json.load(f2)) # 将序列化的字符串转化回原数据类型 # 注意json.dump/load 只能对一个数据进行读取操作,如果有多个字典是不能都写进文件中的,不过我们可以通过其他手段实现 # 多个数据保存到一个文件 import json dic1 = {"name":"alex1","age":18} dic2 = {"name":"alex2","age":18} dic3 = {"name":"alex3","age":18} with open("json_files",encoding=‘utf-8‘,mode=‘w‘) as f1: s1 = json.dumps(dic1) s2 = json.dumps(dic2) s3 = json.dumps(dic3) # 先使用dumps()将字典序列化为字符串 f1.write(s1+‘ ‘+s2+‘ ‘+s3+‘ ‘) # 换行保存字符串 with open("json_files",encoding=‘utf-8‘) as f2: while True: try: for line in f2: print(json.loads(line)) # 这里不必处理strip ‘ ‘, loads会自动忽略 except EOFError: # 当把文件中的序列化字符串读完后会抛出EOFError错误,这里我们使用 try ...except...处理异常 break # 遇到即 break ,怎么知道我们会遇到什么错误呢,一个个都记住是不大可能的,可以特意产生这个错误, # 然后找到python解释器报错的语句就可以了 # {‘name‘: ‘alex1‘, ‘age‘: 18} # {‘name‘: ‘alex2‘, ‘age‘: 18} # {‘name‘: ‘alex3‘, ‘age‘: 18} # pickle的用法和json基本一样,也是dumps(数据类型)/loads(序列化的字符串) dump(数据类型,文件句柄)/load(文件句柄) # 有一点不同的是pickle的dump()/load()可以读取多个序列化字符串 import pickle dic1 = {"name":"alex1","age":18} dic2 = {"name":"alex2","age":18} dic3 = {"name":"alex3","age":18} with open("pickle_files",mode=‘wb‘) as f1: # pickle 无论是dumps还是dump序列化的字符串都是bytes类型的,读写文件只能使用 wb,rb模式,且不能有编码模式 pickle.dump(dic1,f1) pickle.dump(dic2,f1) pickle.dump(dic3,f1) with open("pickle_files",mode=‘rb‘) as f2: while True: try: print(pickle.load(f2)) # 直接读就好了,它会自动一个一个读 except EOFError: break # 使用pickle保存类的对象 # 1,首先在文件中写入对象 import pickle class A: def __init__(self,name,age): self.name = name self.age = age def work(self): print(‘%s正在敲代码‘% self.name) a1 = A(‘alex‘,18) a2 = A(‘sylar‘,20) with open(‘pickle_obj‘,mode=‘wb‘) as f1: pickle.dump(a1,f1) pickle.dump(a2,f1) # 现在我们的文件pick_obj已经保存了A的对象a1,a2,但是因为是我们自己定义的类,对象不能脱离类的定义单独存在, # 所以下面使用文件中的对象有两种方法,一种是在当前文件中保留类 A 的定义,一种是把类 A 的定义放到其他py文件中, # 通过引用该py文件作为模块,这样就有类的定义了 # ***对象的使用,方法一 import pickle class A: def __init__(self,name,age): self.name = name self.age = age def work(self): print(‘%s正在敲代码‘% self.name) li = [] with open(‘pickle_obj‘,mode=‘rb‘) as f2: while True: try: li.append(pickle.load(f2)) except EOFError: break for i in li: print(i.name,i.age) # alex 18 # sylar 20 # ***对象的使用,方法二 import pickle from guo123 import A # 把类A 的定义放到guo123.py文件中 li = [] with open(‘pickle_obj‘,mode=‘rb‘) as f2: while True: try: li.append(pickle.load(f2)) except EOFError: break for i in li: print(i.name,i.age) # alex 18 # sylar 20 # ***shelve*** # shelve给我们提供一个open方法,是用key来访问的,使用起来和字典类似 import shelve dic = {‘int‘:10, ‘float‘:9.5, ‘string‘:‘Sample data‘} f = shelve.open(‘shelve_file‘) f[‘key1‘] = dic f.close() import shelve f1 = shelve.open(‘shelve_file‘) get_dic = f1[‘key1‘] print(get_dic) # {‘int‘: 10, ‘float‘: 9.5, ‘string‘: ‘Sample data‘} # 这时默认是不可以对我们取出来的键值对进行修改或者新增的,如果我们想要 # 修改或者新增的话需要加一个参数 writeback=True f2 = shelve.open(‘shelve_file‘,writeback=True) print(f2[‘key1‘]) # {‘int‘: 10, ‘float‘: 9.5, ‘string‘: ‘Sample data‘} f2[‘key1‘][‘new_value‘] = ‘this was not here before‘ print(f2[‘key1‘]) # {‘int‘: 10, ‘float‘: 9.5, ‘string‘: ‘Sample data‘, ‘new_value‘: ‘this was not here before‘} f2.close()
以上是关于python学习day16 模块的主要内容,如果未能解决你的问题,请参考以下文章