1. 程式人生 > 實用技巧 >常用模組介紹 time datetime os sys hashlib json pickle collections

常用模組介紹 time datetime os sys hashlib json pickle collections

常用模組介紹 time datetime os sys hashlib json pickle collections

  1. time : 和時間相關

    封裝了獲取時間戳和字串的時間段一些方法。

    • time.time() : 獲取時間戳
    • time.gmtime([seconds]) : 獲取格式化時間:是九個欄位組成的
    • time.localtime(seconds) : 獲取格式化時間:是九個欄位組成的
    • time.mktime(t) : 時間物件--> 時間戳
    • time.strftime(format[,t]) : 把時間物件格式化轉化為字串
    • time.strptime(str,format) : 把時間字串轉換為事件物件
    import time
    #獲取時間戳
    #時間戳 ::從時間元年(1970 1 1 00:00:00)到現在經過的秒數。
    # print(time.time())#1594641761.2810633
    # #獲取格式化時間物件:是九個欄位組成的。
    # #預設引數是當前系統時間的時間戳。
    # print(time.gmtime())#
    # print(time.localtime())
    # print(time.gmtime(1))#時間元年過一秒後,對應的時間物件
    #
    # #事件物件 -> 時間戳
    # t1 = time.localtime()#時間物件
    # t2 = time.mktime(t1)#轉化為對應的時間戳
    # print(t2)
    # print(time.time())
    
    #格式化時間物件和字串之間的轉換
    s = time.strftime('year: %Y %m %d %H:%M:%S')
    print(s)
    #把時間字串轉換成時間物件
    time_obj = time.strptime('2020 02 20','%Y %m %d')
    print(time_obj)
    
    

    time 模組三大物件之間的轉換關係:

​ 其他方法: time.sleep(x) : 休眠x 秒。

  1. datetime : 日期時間相關

    包含了和日期時間相關的類,主要有:

    • date : 需要年,月,日三個引數
    • time:需要時,分,秒三個引數
    • datetime:需要年,月,日,時,分,秒六個引數.
    • timedelta:需要一個時間段.可以是天,秒,微秒.

    獲取以上型別的物件,主要作用是和時間段進行數學運算。

    timedelta可以和以下三個類進行數學運算:

    • datetime.time, datetime.datetime,datetime.timedelta

​ 練習:
​ 顯示當前日期前三天是什麼時間.

​ 顯示任意一年的二月份有多少天.

from datetime import datetime
s = datetime.now()#datetime中含有datetime 類,通過from datetime import datetime匯入的才是datetime這個類。##datetime.datetime.now()
import datetime
td = datetime.timedelta(days=3)
res = s - td
print(res)

#普通演算法:根據年份計算是否是閏年 是:29天,否:28天
#用datetime 模組
#首先創建出指定年份的3月1號,然後讓它往前走一天
import datetime
year = int(input('輸入年份:'))
#創建出指定年份的date物件
d = datetime.date(year, 3, 1)
#建立一天的時間段
td = datetime.timedelta(days=1)
res = d - td
print(res.day)
  1. os 模組 和作業系統的模組,主要是檔案刪除,目錄刪除,重新命名等操作

    import os
    #和檔案操作相關,重新命名,刪除
    #os.rename('www666.txt','666.txt')
    #os.remove('666')
    
    #刪除目錄,必須是空目錄
    # os.removedirs('aa')
    #
    # #使用shutil 模組可以刪除帶內容的目錄
    # import shutil
    # shutil.rmtree('aa')
    
    #和路徑相關的操作,被封裝到另一個子模組中:os.path
    # res = os.path.dirname(r'd:/aaa/bbb/ccc/a.txt')#不判斷路徑是否存在
    # print(res)#d:/aaa/bbb/ccc
    #
    # #獲取檔名
    # res = os.path.basename(r'd:/aaa/bbb/ccc/a.txt')
    # print(res)
    #
    # #把路徑中的路徑名和檔名切分開,結果是元祖。
    # res = os.path.split(r'd:/aaa/bbb/ccc/a.txt')
    # print(res)
    #
    # #拼接路徑
    # path = os.path.join('d:\\','aaa','bbb','ccc','a.txt')
    # print(path)
    #
    # #如果是/開頭的路徑,預設在當下碟符
    # res =os.path.abspath(r'/a/b/x')
    # #如果不是以/開頭,預設當前路徑
    # res1 = os.path.abspath(r'a/b/x')
    # print(res1)
    
    # 判斷
    print(os.path.isabs('a.txt'))
    print(os.path.isdir('d:/aaaa.txt')) # 檔案不存在.False
    print(os.path.exists('d:/a.txt'))
    print(os.path.isfile('d:/asssss.txt'))# 檔案不存在.False
    
    
    
  2. sys 模組

    主要是兩個方面:

    • 直譯器執行時獲取引數:sys.argv[x]
    • 直譯器執行時尋找模組的路徑:sys.path

    例如:有a.py 內容如下:

    import sys
    print()print('指令碼名稱:',sys.argv[0]) 
    print('第一個引數:',sys.argv[1])
    print('第二個引數:',sys.argv[2])
    
    指令碼方式執行:
    python a.py hell world
    
  3. json 模組

    JavaScript Object Notation :java指令碼兌現標記語言。

    已經成為一種簡單的資料交換格式

​ 序列化:將其他資料格式轉化成json 字串的過程

​ 反序列化: 將json 字串轉換其他資料型別的過程

​ 涉及到的方法:

  • json.dumps(obj): 將obj轉換成json字串返回到記憶體中。
  • json.dumps(obj,fp): 將obj轉換成json 字串並儲存在fp 指向的檔案中。
  • json.loads(s) : 將記憶體中的json 字串轉換成對應的資料型別物件。
  • json.load(f) : 從檔案中讀取json字串,並轉換回原來的資料型別。

注意:

  • json並不能序列化所有的資料型別:例如:set
  • 元祖型別經過json序列化後,變成列表資料型別。
  • json檔案通常是一次性寫入,一次性讀取。但是檔案本身的方式實現:一行儲存一個序列json字串,在反序列化是,按行反序列化即可。

記憶體中的資料:結構化的資料

磁碟上的資料:線性資料。

序列化比喻:

  1. pickle模組

    python 專用的序列化模組

    和json 的方法一致

    區別在於:

    json:
    1.不是所有的資料型別都可以序列化,結果是字串。
    2.不能多次對同一個檔案序列化。
    3.json資料可以跨語言
    
    pickle:
    1.所有的python序列都能序列化,結果是位元組串。
    2.可以多次對同一個檔案序列化
    3.不能跨語言
    
  2. hashlib模組

    封裝一些用於加密的類

    md5(),……

    加密的目的:用於判斷和驗證,而並非解密。

    特點:

    • 把一個大的資料,切分成不同塊,分別對不同的塊進行加密,再彙總的結果,和直接對整體資料加密的結果是一致的。
    • 單向加密,不可逆。
    • 原始資料的一點小的變化,將導致結果的非常大的差異,“雪崩”效應。
    #註冊,登入程式
    def get_md5(username,passwd):
        m = hashlib.md5()
        m.update(username.encode('utf-8'))
        m.update(username.encode('utf-8'))
        return m.hexdigets()
    
    def register(usname,passwd):
        #加密
        res = get_md5(username,passwd)
        #寫入檔案
        with open('login',mode='at',encoding='utf-8') as f:
            f.write(res)
            f.write('\n')
    
    def login(username,passwd):
        #獲取當前登入資訊的加密結果
        res = get_md5(username,passwd)
        #讀檔案,和其中的資料進行對比
        with open('login',encoding='utf-8',mode='rt') as f:
            for line in f:
                if res ==line.strip():
                    return True
                else:
                    return False
    
    while True:
        op = int(input('1.註冊 2.登入 3.退出'))
        if op == 1:
            username = input('輸入使用者名稱: ')
            passwd = input('輸入密碼: ')
            register(username,passwd)
        elif op ==2 :
            username = input("輸入使用者名稱:")
            passwd = input("輸入密碼:")
            res = login(username,passwd)
            if res:
                print('登入成功')
            else:
                print('登入失敗 ')
        elif op == 3:
            break
    
    
    

    不同的加密物件,結果長度不同,長度越長,越耗時.常用的是md5.