第五章 模塊之 shtil 、 json / pickle、importlib、collections

5.8 shtil 高級的 文件、文件夾、壓縮包 處理模塊

  • shutil.rmtree 刪除目錄python

    import shutil
    shutil.rmtree(path)
  • shutil.move 重命名;移動文件mysql

    import shutil
    shutil.move('test','ttt')
  • shutil.make_archive 壓縮文件夾redis

    import  shutil

    shutil.make_archive('cade\asd','zip',r'E:\Python_WorkSpace\day016 模塊\abc')
  • shutil.unpack_archive 解壓文件sql

    import  shutil

    shutil.unpack_archive('abc.zip',extract_dir=r'E:\Python_WorkSpace\day016 模塊\abc',format='zip')
    # 練習
    # 1.壓縮lizhongwei文件夾 zip
    # 2.放到到 code 目錄(默認不存在)
    # 3.將文件解壓到D:\x1目錄中。

    import os
    import shutil
    from datetime import datetime
    ctime = datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 將當前時間轉換成字符串

    if not os.path.exists('code'): # 判斷 code 文件目錄是否存在
       os.makedirs('code') # 建立 code
    shutil.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

    • json,優勢:全部語言通用;缺點:只能序列化基本的數據類型數據結構

      全部字符串都是雙引號;最外層只能是列表或字典socket

      存在字典的key只能是str;不能連續load屢次ui

    • pickle,優勢:python中幾乎全部的東西都能被序列化(socket對象);缺點:序列化的內容只有python認識spa

      支持連續load屢次code

  • 一個特殊的字符串。【長得像列表、字典、字符串、數字、真假】

     
    +-------------------+---------------+
       | 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 pickle

    v = {1,2,3,4}
    # 序列化,將python的值轉換爲json格式的字符串。
    val = pickle.dumps(v)
    print(val)
    # 反序列化,將json格式的字符串轉換爲python的值。
    data = pickle.loads(val)
    print(data,type(data))

     

    # 示例一
    import json
    v = [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 json
    val = json.dumps(v,ensure_ascii=False)
    print(val) # {"k1": "alex", "k2": "李傑"}
  • dump 將字典以特殊格式寫到文件中

  • load 讀取文件中內容轉換成字典

    v = {'k1':"asdf",'k2':'中文'}

    import json
    f = open('x.txt',mode='w',encoding='utf-8')
    val = json.dump(v,f)
    print(val) # None
    f.close # {"k1": "asdf", "k2": "\u4e2d\u6587"}

    import json
    f = open('x.txt',mode='r',encoding='utf-8')
    val = json.load(f)
    f.close
    print(val,type(val)) # {'k1': 'asdf', 'k2': '中文'} <class 'dict'>
    import pickle

    v = {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 importlib

    middleware_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()

     

 

5.11 collections 增強版數據結構

  1. OrderedDict 有序字典

    # 示例一
    from collections import OrderedDict

    info = OrderedDict()
    info['k1'] = 123
    info['k2'] = 456

    print(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 OrderedDict
    odic = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    print(odic) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    for k in odic:
       print(k,odic[k])
  2. deque 雙端隊列

  3. defaultDict 默認字典,給value設置一個默認值

  4. 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)  # python
    print(python.price) # 19800
相關文章
相關標籤/搜索