python之模塊Ⅱ

模塊Ⅱ

  1. 序列化模塊(重點)python

    1. 定義:將一個數據類型結構(list,dict...)轉化成一個特殊的序列(特殊的字符串)的過程。算法

      ​ 在文件存儲和文件傳輸時有時會遇到,將原數據結構轉化爲str()存儲在文件,或轉化爲bytes經過網絡傳輸後,在讀取文件或接收到文件後沒法轉換爲原數據結構。經過序列化模塊可將原數據類型轉化爲一種特殊的字符串,這個字符串能夠與任何的數據結構相互轉換。shell

    2. 序列化模塊的分類json

      ​ 序列化模塊可將一種數據結構轉化爲特殊的序列(字符串、bytes)而且還能夠轉換回去。目前序列化模塊有三種:json模塊,pickle模塊,shevle模塊安全

      • json序列化網絡

        ​ 是全部語言公認的最經常使用的一種序列,可是支持的python數據結構有限數據結構

        可分爲兩對四個方法:dom

        1. dumps,loads主要用於網絡傳輸,也能夠用於文件的存取函數

          import json
          dic = {'username': '王大錘', 'password': 123,'status': False}
          ret = json.dumps(dic)#序列化:將一個字典轉換成一個字符串
          print(ret,type(ret))
          #{"username": "\u738b\u5927\u9524", "password": 123, "status": false} <class 'str'>
          #注意,json轉換完的字符串類型的字典中的字符串是由""表示的
          ret_dict = json.loads(ret)#反序列化:將一個字符串格式的字典轉換成一個字典
          print(ret_dict)
          #{'username': '王大錘', 'password': 123, 'status': False}
          #注意,要用json的loads功能處理的字符串類型的字典中的字符串必須由""表示

          可傳遞參數:加密

          dic = {'username': '王大錘', 'password': 123,'status': False}
          ret = json.dumps(dic,ensure_ascii=False,sort_keys=True)
          print(ret,type(ret))
          #{"password": 123, "status": false, "username": "王大錘"} <class 'str'>

          ​ 其餘參數說明:ensure_ascii:,當它爲True的時候,全部非ASCII碼字符顯示爲\uXXXX序列,只需在dump時將ensure_ascii設置爲False便可,此時存入json的中文便可正常顯示。 separators:分隔符,其實是(item_separator, dict_separator)的一個元組,默認的就是(‘,’,’:’);這表示dictionary內keys之間用「,」隔開,而KEY和value之間用「:」隔開。 sort_keys:將數據根據keys的值進行排序。

          存取文件:

          import json
          dic = {'username': '王大錘', 'password': 123,'status': False}
          s_dict = json.dumps(dic)
          with open('jsonlx.json',encoding='utf-8',mode='w') as f1:
              f1.write(s_dict)
          with open('jsonlx.json',encoding='utf-8') as f2:
              content = f2.read()
              print(json.loads(content))
        2. dump,load用於文件存取

          import json
          f = open('json_file.json','w')
          dic = {'k1':'v1','k2':'v2','k3':'v3'}
          json.dump(dic,f)  #dump方法接收一個文件句柄,直接將字典轉換成json字符串寫入文件
          f.close()
          # json文件也是文件,就是專門存儲json字符串的文件。
          f = open('json_file.json')
          dic2 = json.load(f)  #load方法接收一個文件句柄,直接將文件中的json字符串轉換成數據結構返回
          f.close()
          print(type(dic2),dic2)
        3. 將多個數據存儲到文件中

          import json
          dic1 = {'username': '王大錘', 'password': 123,'status': False}
          dic2 = {'username': 'abc', 'password': 123,'status': False}
          dic3 = {'username': 'ly', 'password': 123,'status': False}
          with open('jsonmore.json',encoding='utf-8',mode='a') as f1:
              f1.write(f'{json.dumps(dic1)}\n{json.dumps(dic2)}\n{json.dumps(dic3)}')
          
          with open('jsonmore.json',encoding='utf-8') as f1:
              for line in f1:
                  ret = json.loads(line)
                  print(ret,type(ret))
      • pickle序列化

        1. dumps,loads只能用於網絡傳輸

          import pickle
          l1 = ['wusir', '太白', '小黑', 666]
          ret = pickle.dumps(l1)
          print(ret)
          #b'\x80\x03]q\x00(X\x06\x00\x00\x00\xe5\xb0\x8f\xe9\xbb\x91q\x01M\x9a\x02e.'
          l2 = pickle.loads(ret)
          print(l2,type(l2))
          ['小黑', 666] <class 'list'>
        2. dump,load只能用於文件存取

          import pickle
          l1 = ['wusir', '太白', '小黑', 666]
          with open('pickle練習.pickle',mode='wb') as f1:
              pickle.dump(l1,f1)
          
          with open('pickle練習.pickle', mode='rb') as f1:
              ret = pickle.load(f1)
              print(ret,type(ret))
        3. 多個數據寫入

          # 多個數據寫入文件
          l1 = ['wusir', '太白', '小黑1', 666]
          l2 = ['wusir', '太白', '小黑2', 666]
          l3 = ['wusir', '太白', '小黑3', 666]
          with open('pickle練習1.pickle',mode='wb') as f1:
              pickle.dump(l1,f1)
              pickle.dump(l2,f1)
              pickle.dump(l3,f1)
          
          with open('pickle練習1.pickle', mode='rb') as f1:
              ret1 = pickle.load(f1)
              ret2 = pickle.load(f1)
              ret3 = pickle.load(f1)
              print(ret1,ret2,ret3)
  2. os模塊

    • 與工做目錄(當前目錄、父級目錄)有關的

      import os
      print(os.getcwd())  # 獲取當前工做目錄,即當前python腳本工做的目錄路徑  **
      os.chdir(r'D:\s23\day9')# 改變當前腳本工做目錄;至關於shell下cd  **
      os.curdir # 返回當前目錄: ('.')  **
      os.pardir # 獲取當前目錄的父目錄字符串名:('..') **
    • 和文件夾相關 ***

      os.makedirs('dirname1/dirname2')    #可生成多層遞歸目錄  ***
      os.removedirs('dirname1') #若目錄爲空,則刪除,並遞歸到上一級目錄,如若也爲空,則刪除,依此類推 ***
      os.mkdir('dirname')    #生成單級目錄;至關於shell中mkdir dirname ***
      os.rmdir('dirname')    #刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname ***
      os.listdir('dirname')    #列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印 **
    • 和文件相關

      os.remove()  #刪除一個文件  ***
      os.rename("oldname","newname")  #重命名文件/目錄  ***
      os.stat('path/filename')  #獲取文件/目錄信息 **
    • 和路徑相關

      os.path.abspath(path) #返回path規範化的絕對路徑  ***
      os.path.split(path) #將path分割成目錄和文件名二元組返回 ***
      os.path.dirname(path) #返回path的目錄。其實就是os.path.split(path)的第一個元素  **
      os.path.basename(path) #返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值,即os.path.split(path)的第二個元素。 **
      os.path.exists(path)  #若是path存在,返回True;若是path不存在,返回False  ***
      os.path.isabs(path)  #若是path是絕對路徑,返回True  **
      os.path.isfile(path)  #若是path是一個存在的文件,返回True。不然返回False  ***
      os.path.isdir(path)  #若是path是一個存在的目錄,則返回True。不然返回False  ***
      os.path.join(path1[, path2[, ...]])  #將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略 ***
      os.path.getatime(path)  #返回path所指向的文件或者目錄的最後訪問時間  **
      os.path.getmtime(path)  #返回path所指向的文件或者目錄的最後修改時間  **
      os.path.getsize(path) #返回path的大小 ***
  3. sys模塊

    sys模塊是與python解釋器交互的一個接口

    sys.argv           #命令行參數List,第一個元素是程序自己路徑
    sys.exit(n)        #退出程序,正常退出時exit(0),錯誤退出sys.exit(1)
    sys.version        #獲取Python解釋程序的版本信息
    sys.path           #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值  ***
    sys.platform       #返回操做系統平臺名稱
  4. hashlib模塊

    1. 定義:加密模塊、摘要算法、散列算法等等,他是一堆加密算法的集合

    2. hashlib如何加密

      • 將一個bytes類型的數據經過hashlib進行加密,返回一個等長度的16進制數字
      • 過程不可逆
      • 相同的bytes類型的數據經過相同加密方法獲得的數字絕對相同
      • 不相同的bytes類型的數據經過相同加密方法獲得的數字絕對不相同
    3. 用途

      • 文件加密,md5加密級別是最低的,sha系列安全係數高,耗時高。

        import hashlib
        md5 = hashlib.md5()
        md5.update('123456'.encode('utf-8'))
        print(md5.hexdigest())
        # 'e10adc3949ba59abbe56e057f20f883e'

        加固定的鹽

        ret = hashlib.md5('xxx公司'.encode('utf-8'))
        ret.update('123456'.encode('utf-8'))
        s = ret.hexdigest()
        print(s,type(s))
        # 1ef97f2f10b2ba2dc273a9641cd713d2 <class 'str'>

        加動態的鹽

        username = input('輸入用戶名:').strip()
        password = input('輸入密碼').strip()
        ret = hashlib.md5(username[::2].encode('utf-8'))
        ret.update(password.encode('utf-8'))
        s = ret.hexdigest()
        print(s)
      • 文件一致性校驗

        import hashlib
        def md5_file(path):
            ret = hashlib.md5()
            with open(path,mode='rb') as f1:
                while 1:
                    content = f1.read(1024)
                    if content:
                        ret.update(content)
                    else:
                        return ret.hexdigest()
  5. time模塊

    三種表示方式:時間戳(timestamp)、格式化的時間字符串(Format String)、元組(struct_time)

    • 時間戳

      import time
      print(time.time())
      # 1561713996.1833062
    • 時間字符串

      import time
      print(time.strftime('%y-%m-%d %H:%M:%S'))
      # 19-06-28 17:27:27
    • 結構化時間

      localtime將一個時間戳轉換爲當前時區的struct_time

      import time
      timestamp = time.time()
      st = time.localtime(timestamp)
      print(st)
      # time.struct_time(tm_year=2019, tm_mon=6, tm_mday=28, tm_hour=17, tm_min=34, tm_sec=33, tm_wday=4, tm_yday=179, tm_isdst=0)

    格式化時間 ----> 時間戳

    ft = time.strftime('%Y/%m/%d %H:%M:%S')
    st = time.strptime(ft,'%Y/%m/%d %H:%M:%S')
    print(st) # 轉化爲結構化時間
    timestamp = time.mktime(st)
    print(timestamp) # 轉化爲時間戳
    # time.struct_time(tm_year=2019, tm_mon=6, tm_mday=28, tm_hour=17, tm_min=35, tm_sec=55, tm_wday=4, tm_yday=179, tm_isdst=-1)
    #1561714737.0

    時間戳 ---> 結構化時間

    t = time.time()
    st = time.localtime(t)
    print(st) # 轉化爲結構化時間
    ft = time.strftime('%Y/%m/%d %H:%M:%S',st)
    print(ft) # 轉化爲格式化時間
    # time.struct_time(tm_year=2019, tm_mon=6, tm_mday=28, tm_hour=17, tm_min=42, tm_sec=55, tm_wday=4, tm_yday=179, tm_isdst=0)
    # 19-06-28 17:42:55
  6. datetime模塊

    # datatime模塊
    import datetime
    now_time = datetime.datetime.now()  # 如今的時間
    # 只能調整的字段:weeks days hours minutes seconds
    print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三週後
    print(datetime.datetime.now() + datetime.timedelta(weeks=-3)) # 三週前
    current_time = datetime.datetime.now()
    # 可直接調整到指定的 年 月 日 時 分 秒 等
    
    print(current_time.replace(year=1977))  # 直接調整到1977年
    print(current_time.replace(month=1))  # 直接調整到1月份
    print(current_time.replace(year=1989,month=4,day=25))  # 1989-04-25 18:49:05.898601
    
    # 將時間戳轉化成時間
    print(datetime.date.fromtimestamp(1232132131))  # 2009-01-17
  7. random模塊

    >>> import random
    #隨機小數
    >>> random.random()      # 大於0且小於1之間的小數
    0.7664338663654585
    >>> random.uniform(1,3) #大於1小於3的小數
    1.6270147180533838
    
    #隨機整數
    >>> random.randint(1,5)  # 大於等於1且小於等於5之間的整數
    >>> random.randrange(1,10,2) # 大於等於1且小於10之間的奇數
    
    
    #隨機選擇一個返回
    >>> random.choice([1,'23',[4,5]])  # #1或者23或者[4,5]
    #隨機選擇多個返回,返回的個數爲函數的第二個參數
    >>> random.sample([1,'23',[4,5]],2) # #列表元素任意2個組合
    [[4, 5], '23']
    
    
    #打亂列表順序
    >>> item=[1,3,5,7,9]
    >>> random.shuffle(item) # 打亂次序
    >>> item
    [5, 1, 3, 7, 9]
    >>> random.shuffle(item)
    >>> item
    [5, 9, 7, 1, 3]
相關文章
相關標籤/搜索