5.8 shtil 高级的 文件、文件夹、压缩包 处理模块
-
shutil.rmtree 删除目录
import shutilshutil.rmtree(path)
-
shutil.move 重命名;移动文件
import shutilshutil.move('test','ttt') -
shutil.make_archive 压缩文件夹
import shutilshutil.make_archive('cade\asd','zip',r'E:\Python_WorkSpace\day016 模块\abc') -
shutil.unpack_archive 解压文件
import shutilshutil.unpack_archive('abc.zip',extract_dir=r'E:\Python_WorkSpace\day016 模块\abc',format='zip')# 练习# 1.压缩lizhongwei文件夹 zip# 2.放到到 code 目录(默认不存在)# 3.将文件解压到D:\x1目录中。import osimport shutilfrom datetime import datetimectime = datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 将当前时间转换成字符串if not os.path.exists('code'): # 判断 code 文件目录是否存在 os.makedirs('code') # 创建 codeshutil.make_archive(os.path.join('code',ctime),'zip','D:\code\s21day16\lizhongwei') # 压缩文件 在code文件夹中,名称为2019-04-18-17-12-24压缩文件file_path = os.path.join('code',ctime) + '.zip' #被解压文件名称 shutil.unpack_archive(file_path,r'D:\x1','zip') #解压文件到指定目录
5.9 json / pickle 序列化
-
二者优缺点
-
json,优点:所有语言通用;缺点:只能序列化基本的数据类型
所有字符串都是双引号;最外层只能是列表或字典
存在字典的key只能是str;不能连续load多次
-
pickle,优点:python中几乎所有的东西都能被序列化(socket对象);缺点:序列化的内容只有python认识
支持连续load多次
-
-
一个特殊的字符串。【长得像列表、字典、字符串、数字、真假】
+-------------------+---------------+ | Python | JSON | +===================+===============+ | dict | object | +-------------------+---------------+ | list, tuple | array | +-------------------+---------------+ | str | string | +-------------------+---------------+ | int, float | number | +-------------------+---------------+ | True | true | +-------------------+---------------+ | False | false | +-------------------+---------------+ | None | null | +-------------------+---------------+
-
dumps 序列化,将python的值转换为json格式的字符串(str/bytes类型)。
-
loads 反序列化,将json格式的字符串转换为python的值。
import picklev = {1,2,3,4}# 序列化,将python的值转换为json格式的字符串。val = pickle.dumps(v)print(val)# 反序列化,将json格式的字符串转换为python的值。data = pickle.loads(val)print(data,type(data))# 示例一import jsonv = [1,2,3,4,'frfed','tgrf',[1,3,2]]# 序列化,将python的值转换为json格式的字符串。v1 = json.dumps(v)print(v1,type(v1)) # [1, 2, 3, 4, "frfed", "tgrf", [1, 3, 2]] <class 'str'># 反序列化,将json格式的字符串转换为python的值。v3 = json.loads(v1)print(v3,type(v3)) # [1, 2, 3, 4, 'frfed', 'tgrf', [1, 3, 2]] <class 'list'>
-
字典或列表中如有中文,序列化时想要保留中文显示:
v = {'k1':"asdf",'k2':'中文'}import jsonval = json.dumps(v,ensure_ascii=False)print(val) # {"k1": "alex", "k2": "李杰"} -
dump 将字典以特殊格式写到文件中
-
load 读取文件中内容转换成字典
v = {'k1':"asdf",'k2':'中文'}import jsonf = open('x.txt',mode='w',encoding='utf-8')val = json.dump(v,f)print(val) # Nonef.close # {"k1": "asdf", "k2": "\u4e2d\u6587"}import jsonf = open('x.txt',mode='r',encoding='utf-8')val = json.load(f)f.closeprint(val,type(val)) # {'k1': 'asdf', 'k2': '中文'} <class 'dict'>import picklev = {1,2,3,4}f = open('x.txt',mode='wb')val = pickle.dump(v,f)f.close()f = open('x.txt',mode='rb')data = pickle.load(f)f.close()print(data)
5.10 importlib 根据字符串的形式导入模块。
模块 = importlib.import_module('utils.redis')
# 示例一 import importlib # 用字符串形式导入模块 redis = importlib.import_module('utils.redis') # 用字符串的形式去对象(模块)找到他的成员 getattr(redis,'func')() # 示例二 import importlib path = 'utils.redis.func' module_path,func_name = path.rsplit('.',maxsplit=1) module_object = importlib.import_module(module_path) getattr(module_object,func_name)()
-
开放封闭原则
对配置文件开放
对源代码封闭
import importlibmiddleware_classes = [ 'utils.redis.Redis', # 'utils.mysql.MySQL', 'utils.mongo.Mongo']for path in middleware_classes: module_path,class_name = path.rsplit('.',maxsplit=1) module_object = importlib.import_module(module_path)# from utils import redis cls = getattr(module_object,class_name) obj = cls() obj.connect()

-
OrderedDict 有序字典
# 示例一from collections import OrderedDictinfo = OrderedDict()info['k1'] = 123info['k2'] = 456print(info.keys()) # odict_keys(['k1', 'k2'])print(info.values()) # odict_values([123, 456])print(info.items()) # odict_items([('k1', 123), ('k2', 456)])# 示例二from collections import OrderedDictodic = OrderedDict([('a', 1), ('b', 2), ('c', 3)])print(odic) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])for k in odic: print(k,odic[k]) -
deque 双端队列
-
defaultDict 默认字典,给value设置一个默认值
-
namedtuple 可命名元祖
应用:创建一个类,这个类没有办法,所有的属性的值都不能修改
from collections import namedtuple # 可命名元组Course = namedtuple('Course',['name','price','teacher'])python = Course('python',19800,'alex')print(python) # Course(name='python', price=19800, teacher='alex')print(python.name) # pythonprint(python.price) # 19800