7、模塊

1. 序列化模塊

1.1 json和pickle的區別

  • 序列化以後的數據類型編程

    json: str
    pickle: bytes
  • 適用範圍json

    json:全部的編程語言
    pickle:僅限於Python適用
  • 可序列化的數據類型app

    json: int float bool str list tuple dict None
    pickle: 全部數據類型
  • load方法適用的不一樣dom

    json:不能連續load,只能一次性拿出全部的數據
    pickle:能夠連續load,多套數據放在同一個文件中

1.2 json模塊

  • json.dumps()和json.loads()編程語言

    import json
    
    test = [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None]
    
    # 序列化
    result = json.dumps(test)
    res = json.dumps(test, ensure_ascii=False)
    print(result, type(result))
    print(res, type(res))
    
    # 反序列化
    recovery = json.loads(result)
    print(recovery, type(recovery))
    
    # 輸出結果
    [1, 4.5, true, "\u6a21\u5757", ["b", "c"], [2, 3], {"name": "aaron"}, null] <class 'str'>
    [1, 4.5, true, "模塊", ["b", "c"], [2, 3], {"name": "aaron"}, null] <class 'str'>
    [1, 4.5, True, '模塊', ['b', 'c'], [2, 3], {'name': 'aaron'}, None] <class 'list'>
    
    '''
    注意:
      1.序列化的結果中全部的字符串類型的數據都使用雙引號""
      2.序列化以後漢字是使用unicode格式輸出的,若想輸出直接是漢字,秩序在序列化時多加一個ensure_ascii參數便可。
    '''
  • json.dump()和json.load()ide

    import json
    
    test = [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None]
    
    # 將序列化後的數據寫入文件中
    with open('json.txt', mode='w', encoding='utf-8') as fp:
        json.dump(test, fp, ensure_ascii=False)
    
    # 將文件中的數據反序列化
    with open('json.txt', mode='r', encoding='utf-8') as fp:
        result = json.load(fp)
        print(result, type(result))
    
    # 輸出結果
    [1, 4.5, True, '模塊', ['b', 'c'], [2, 3], {'name': 'aaron'}, None] <class 'list'>

1.3 pickle模塊

  • pickle.dumps()和pickle.loads()編碼

    import pickle
    
    test = [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None]
    
    # 序列化
    result = pickle.dumps(test)
    print(result, type(result))
    
    # 反序列化
    recovery = pickle.loads(result)
    print(recovery, type(recovery))
    
    # 輸出結果
    b'\x80\x03]q\x00(K\x01G@\x12\x00\x00\x00\x00\x00\x00\x88X\x06\x00\x00\x00\xe6\xa8\xa1\xe5\x9d\x97q\x01]q\x02(X\x01\x00\x00\x00bq\x03X\x01\x00\x00\x00cq\x04eK\x02K\x03\x86q\x05}q\x06X\x04\x00\x00\x00nameq\x07X\x05\x00\x00\x00aaronq\x08sNe.' <class 'bytes'>
    [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] <class 'list'>
  • pickle.dump()和pickle.load()idea

    import pickle
    
    test = [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None]
    
    # 將序列化後的數據寫入文件中
    with open('pickle.txt', mode='wb') as fp:
        pickle.dump(test, fp)
        pickle.dump(test, fp)
        pickle.dump(test, fp)
    
    # 將文件中的數據反序列化
    with open('pickle.txt', mode='rb') as fp:
        result = pickle.load(fp)
        print(result, type(result))
        result = pickle.load(fp)
        print(result, type(result))
        result = pickle.load(fp)
        print(result, type(result))
    
    # 輸出結果
    [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] <class 'list'>
    [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] <class 'list'>
    [1, 4.5, True, '模塊', ['b', 'c'], (2, 3), {'name': 'aaron'}, None] <class 'list'>
    
    # 注意:打開文件時要以二進制格式打開。

2. 時間模塊

2.1 time模塊

# time.time(): 獲取當前的本地時間戳(從1970年1月1日零點到如今的秒數)
# time.localtime():經過時間戳獲取時間元組(默認當前時間)
# time.ctime(): 經過時間戳獲取時間字符串(默認當前時間)
# time.strftime(格式化字符串, [時間元組]):經過時間元組格式化時間字符串(時間元組時可選參數)
# time.strptime(時間字符串, 格式化字符串):經過時間字符串提取出時間元組
# time.sleep():程序睡眠等待
# time.perf_counter():用於計算程序運行的時間


import time

result = time.time()
print(1, result, type(result))

result = time.localtime()
print(2, result, type(result))

result = time.ctime()
print(3, result, type(result))

result = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
print(4, result, type(result))

# 注意:兩個參數的書寫內容必須徹底相同
result = time.strptime('2019年11月15日21時41分51秒', '%Y年%m月%d日%H時%M分%S秒')
print(5, result, type(result))

start = time.perf_counter()
time.sleep(5)
end = time.perf_counter()
result = end - start
print(6, result, type(result))

# 輸出結結果
1 1573827926.2985218 <class 'float'>
2 time.struct_time(tm_year=2019, tm_mon=11, tm_mday=15, tm_hour=22, tm_min=25, tm_sec=26, tm_wday=4, tm_yday=319, tm_isdst=0) <class 'time.struct_time'>
3 Fri Nov 15 22:25:26 2019 <class 'str'>
4 2019-11-15 22:25:26 <class 'str'>
5 time.struct_time(tm_year=2019, tm_mon=11, tm_mday=15, tm_hour=21, tm_min=41, tm_sec=51, tm_wday=4, tm_yday=319, tm_isdst=-1) <class 'time.struct_time'>
6 5.0000196 <class 'float'>

2.2 datetime模塊

# datetime.datetime.now():獲取如今本地的時間
# datetime.datetime.utcnow():獲取當前的UTC時間
# datetime.datetime.strftime():將datetime.datetime格式的時間轉化爲指定格式的str
# datetime.datetime.strptime():將str格式的時間轉化爲datetime.datetime格式的時間
# datetime.timedelta():用做datetime.datetime格式時間的加減運算的參數
# datetime.timezone(datetime.timedelta(hours=n)):獲取指定的時區


import datetime

result1 = datetime.datetime.now()
print(1, result1, type(result1))

result2 = datetime.datetime.strftime(result1, '%Y-%m-%d %H:%M:%S')
print(2, result2, type(result2))

result3 = datetime.datetime.strptime(result2, '%Y-%m-%d %H:%M:%S')
print(3, result3, type(result3))

result4 = datetime.datetime.utcnow()
print(4, result4, type(result4))

result5 = datetime.timedelta(days=30, hours=2, minutes=5, seconds=30)
print(5, result5, type(result5))

# 獲取與當前UTC時間加上30天2小時5分鐘30秒以後的時間
result6 = result4 + result5
print(6, result6, type(result6))

result7 = datetime.timezone(datetime.timedelta(hours=2, minutes=5, seconds=30))
print(7, result7, type(result7))

# 輸出結果
1 2019-11-16 11:39:37.096657 <class 'datetime.datetime'>
2 2019-11-16 11:39:37 <class 'str'>
3 2019-11-16 11:39:37 <class 'datetime.datetime'>
4 2019-11-16 03:39:37.120650 <class 'datetime.datetime'>
5 30 days, 2:05:30 <class 'datetime.timedelta'>
6 2019-12-16 05:45:07.120650 <class 'datetime.datetime'>
7 UTC+02:05:30 <class 'datetime.timezone'>

3. random模塊

  • random.random()spa

    # 隨機獲取0~1之間的小數(0 <= x < 1)
    
    import random
    
    result = random.random()
    print(result)
  • random.randrange()

    # 隨機獲取指定範圍內的整數
    
    import random
    
    result1 = random.randrange(7)
    result2 = random.randrange(1, 7)
    result3 = random.randrange(1, 7, 2)
  • random.randint()

    • 注意:其指定範圍是閉區間
    # 隨機獲取指定範圍的整數
    
    import random
    
    result = random.randint(1, 6)
    print(result)
  • random.uniform()

    # 獲取指定範圍內的隨機小數
    
    import random
    
    result = random.uniform(1, 5)
    print(result)
    
    # 注意:return a + (b-a) * self.random()
  • random.choice()

    # 隨機獲取指定序列中的任一元素
    
    import random
    
    test_list = [1, 3, 5, 7, 9]
    result = random.choice(test_list)
    print(result)
    • 隨機生成驗證碼
    import random
    
    def create_verify_code(n):
        '''
        隨機生成一個由字母和數字組成的n位驗證碼
        :param n:指定生成二維碼的長度
        :return:返回生成的驗證碼
        '''
    
        verify_code = ''
        for item in range(n):
            # 將ASCII編碼轉換成對應的字符
            up  
            per_cha = chr(random.randrange(65, 91))
            lower_cha = chr(random.randrange(97, 123))
            number = str(random.randrange(0, 10))
            choice_list = [upper_cha, lower_cha, number]
            verify_code += random.choice(choice_list)
    
        return verify_code
    
    
    result1 = create_verify_code(5)
    result2 = create_verify_code(10)
    print(result1)
    print(result2)
    
    # 輸出結果
    V9V7y
    1rxX2v0sG2
  • random.sample()

    # 隨機獲取指定序列中的指定個數的元素
    
    import random
    
    test_list = [1, 3, 5, 7, 9]
    result = random.sample(test_list, 2)
    
    print(result, type(result))
    
    # 注意:結果存放在一個列表中
  • random.shuffle()

    # 隨機打亂列表中的值
    
    import random
    
    test_list = [1, 3, 5, 7, 9]
    random.shuffle(test_list)
    
    print(test_list)
    
    # 注意:該方法是對原列表自己進行操做,無返回值。

4. shutil模塊

# shutil.copy():複製文件的權限和內容
# shutil.move():修改文件名
# shutil.rmtree():刪除指定目錄下的全部內容
# shutil.make_archive():壓縮文件
# shutil.unpack_archive():解壓文件

import shutil

shutil.copy('a.txt', 'b.txt')
shutil.move('1.txt', 'c.txt')
path1 = r'C:\Python38\Scripts\exercise\advance\try\a\b'
path2 = r'C:\Python38\Scripts\exercise\advance\try\test'
shutil.make_archive('a_packed', 'zip', path1)
shutil.unpack_archive('b_packed.zip', extract_dir=path2)
shutil.rmtree('a')
  • 運行shutil模塊.py以前

  • 運行shutil模塊.py以後

5. os模塊

  • 執行系統命令

    # os.system():執行系統命令,將結果直接輸出
    # os.popen():執行系統命令,能夠將結果轉換成utf-8的格式輸出
    
    import os
    
    command = 'date'
    os.system(command)
    
    result = os.popen(command).read()
    print(result, type(result))
    
    # 輸出結果
    ��ǰ����: 2019/11/16 ���� 
    ����������: (������) 
    
    
    當前日期: 2019/11/16 週六 
    輸入新日期: (年月日) 
     <class 'str'>
  • 目錄操做

    # os.lsitdir():獲取指定目錄下的全部文件和文件夾
    # os.getcwd():獲取當前文件工做所在目錄的絕對路徑
    # os.chdir():將當前文件工做的目錄改變爲指定的路徑下的目錄
    
    import os
    
    result = os.listdir(r'C:\Python38\Scripts\exercise')
    print(result, type(result))
    
    result = os.getcwd()
    print(result, type(result))
    
    os.chdir(r'C:\Python38\Scripts\exercise')
    
    result = os.getcwd()
    print(result, type(result))
    
    # 輸出結果
    C:\Python38\Scripts\exercise\advance
    C:\Python38\Scripts\exercise\advance
     <class 'str'>
    ['.idea', 'advance'] <class 'list'>
    C:\Python38\Scripts\exercise\advance <class 'str'>
    C:\Python38\Scripts\exercise <class 'str'>

  • 文件和文件夾操做

    # os.remove():刪除文件
    # os.mkdir():建立文件夾
    # os.rmdir():刪除文件夾(只能刪除空文件夾)
    # os.rename():重命名文件(夾)
  • os.environ

    # os.environ:獲取或修改環境變量
    
    import os
    
    # 獲取環境變量
    result1 = os.environ['PATH']
    result2 = result1.split(';')
    print(result2[-3:])
    
    # 增長環境變量
    os.environ['PATH'] += r'C:\softwares\QQ\DAUM\PotPlayer;'
    result3 = os.environ['PATH']
    result4 = result3.split(';')
    print(result4[-3:])
    
    os.system('PotPlayerMini.exe')
    
    # 輸出結果
    ['C:\\Python27\\Scripts\\', 'C:\\Python27\\', '']
    ['C:\\Python27\\', 'C:\\softwares\\QQ\\DAUM\\PotPlayer', '']
    
    # 注意:PotPlayerMini.exe是路徑C:\softwares\QQ\DAUM\PotPlayer下的一個可執行文件;添加的環境變量是臨時的,只在改文件執行時有效。
  • 模塊屬性

    # os.name:獲取系統標識(Windows:nt  Linux&Mac:posix)
    # os.sep:獲取路徑分隔符(Windows:\  Linux&Mac:/)
    # os.linesep:獲取系統的換行符(Windows:\r\n或\n  Linux&Mac:\n)
    
    import os
    
    result = os.name
    print(result)
    
    result = os.sep
    print(result)
    
    result = os.linesep
    print(repr(result))
    
    # 輸出結果
    nt
    \
    '\r\n'
    • Linux下運行結果

  • 路徑操做

    • os.path模塊
    # os.path.abspath():將路徑轉化爲絕對路徑
    # os.path.basenaem():返回文件名部分
    # os.path.dirname():返回路勁部分
    # os.path.split():將路徑拆分紅文件名部分和路勁部分,存放在一個元組中
    # os.path.splitext():將路徑拆分紅後綴和剩餘部分,存放在一個元組中
    # os.path.join():將多個路徑拼接成一個路徑(根據系統自動選擇拼接的鏈接符)
    # os.path.getsize():獲取文件大小
    # os.path.isdir():判斷路徑是不是文件夾
    # os.path.isfile():判斷路徑是不是文件
    # os.path.exits():判斷指定路徑是否存在
    
    import os
    
    result1 = os.path.abspath('a.txt')
    print(result1)
    
    result2 = os.path.basename(result1)
    print(result2)
    
    result3 = os.path.dirname(result1)
    print(result3)
    
    result4 = os.path.split(result1)
    print(result4)
    
    result5 = os.path.splitext(result1)
    print(result5)
    
    path1 = r'C:\dir\cherry'
    path2 = r'cd\apple.txt'
    result6 = os.path.join(path1, path2)
    print(result6)
    
    result7 = os.path.getsize('a.txt')
    print(result7)
    
    result8 = os.path.isdir(result3)
    result9 = os.path.isdir(result1)
    print(result8, result9)
    
    result10 = os.path.isfile(result1)
    result11 = os.path.isfile(result3)
    print(result10, result11)
    
    result12 = os.path.exists(result1)
    result13 = os.path.exists(result6)
    print(result12, result13)
    
    # 輸出結果
    C:\Python38\Scripts\exercise\advance\a.txt
    a.txt
    C:\Python38\Scripts\exercise\advance
    ('C:\\Python38\\Scripts\\exercise\\advance', 'a.txt')
    ('C:\\Python38\\Scripts\\exercise\\advance\\a', '.txt')
    C:\dir\cherry\cd\apple.txt
    44
    True False
    True False
    True False
    • 求指定文件夾的大小

      • os.walk方法
      import os
      
      def calc_file_size(path):
          '''
          求指定文件夾的大小
          :param path:文件夾的路徑
          :return:文件夾大小
          '''
      
          file_size = 0
      
          for dirpath, dirnames, filenames in os.walk(path):
              for i in filenames:
                  item = os.path.join(dirpath, i)
                  print(item)
                  file_size += os.path.getsize(item)
      
          return file_size
      
      
      file_path = os.path.abspath('get_size')
      result = calc_file_size(file_path)
      print(result)
      
      # 輸出結果
      C:\Python38\Scripts\exercise\advance\get_size\file1.txt
      C:\Python38\Scripts\exercise\advance\get_size\dir1\file2.log
      C:\Python38\Scripts\exercise\advance\get_size\dir1\file3.log
      C:\Python38\Scripts\exercise\advance\get_size\dir1\dir2\file4.txt
      842
      • 遞歸法
      import os
      
      def calc_file_size(path):
          '''
          求指定文件夾的大小
          :param path:文件夾的路徑
          :return:文件夾大小
          '''
      
          file_size = 0
      
          for i in os.listdir(path):
              item = os.path.join(path, i)
              if os.path.isdir(item):
                  file_size += calc_file_size(item)
              elif os.path.isfile(item):
                  print(item)
                  file_size += os.path.getsize(item)
      
          return file_size
      
      
      file_path = os.path.abspath('get_size')
      result = calc_file_size(file_path)
      print(result)
      
      # 輸出結果
      C:\Python38\Scripts\exercise\advance\get_size\dir1\dir2\file4.txt
      C:\Python38\Scripts\exercise\advance\get_size\dir1\file2.log
      C:\Python38\Scripts\exercise\advance\get_size\dir1\file3.log
      C:\Python38\Scripts\exercise\advance\get_size\file1.txt
      842

    • 注意

      兩種方法在計算文件夾大小時,方法一是從最外層的文件開始計算的;方法二是從最內層的文件開始計算的。

6. sys模塊

  • sys.path

    # sys.path:查看能夠直接進行導入模塊的路徑
    
    import sys
    
    result = sys.path
    print(result)
    
    # 輸出結果
    ['C:\\Python38\\Scripts\\exercise\\advance', 'C:\\Python38\\python38.zip', 'C:\\Python38\\DLLs', 'C:\\Python38\\lib', 'C:\\Python38', 'C:\\Python38\\lib\\site-packages']
  • sys.argv

    # sys.argv:獲取用戶執行腳本時,傳入的參數
    
    import sys
    
    result = sys.argv
    print(result)
    
    # 輸出結果
    ['C:\\Python38\\Scripts\\exercise\\advance\\14sys模塊.py', '參數一', '參數二', '參數三']

    注意:執行腳本時需在命令行窗口進行。

7. logging模塊

  • 格式一(推薦使用)

    import logging
    
    # 建立一個logger對象,同時配置其名字和寫入日誌內容的等級
    logger = logging.Logger('Aaron', level=logging.WARNING)
    # 建立一個文件操做符,包含文件名稱,文件的打開格式以及文件的編碼方式
    file_handler = logging.FileHandler('test.log', mode='a', encoding='utf-8')
    # 建立一個屏幕操做符(輸出內容直接在原來print輸出的地方)
    stream_handler = logging.StreamHandler()
    # 建立一個格式
    fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(module)s :%(message)s')
    # 給文件操做符設置格式
    file_handler.setFormatter(fmt)
    # 給屏幕操做符設置格式
    stream_handler.setFormatter(fmt)
    # 給logger對象綁定文件操做
    logger.addHandler(file_handler)
    # 給logger對象綁定屏幕操做
    logger.addHandler(stream_handler)
    
    # 生成日誌的內容,等級大於等於以前設置好的日誌等級的內容纔會寫入到日誌中
    logger.debug('This is debug')
    logger.info('This is info')
    logger.warning('This is warning')
    logger.error('This is error')
    logger.fatal('This is fatal')
    
    # 在日誌文件test.log中寫入的內容和在操做臺顯示的內容均爲:
    2019-11-08 10:07:56,692 - Aaron - WARNING - demo25 :This is warning
    2019-11-08 10:07:56,692 - Aaron - ERROR - demo25 :This is error
    2019-11-08 10:07:56,692 - Aaron - CRITICAL - demo25 :This is fatal
    
    # 注意:寫入日誌的等級分爲五個等級(DEBUG、INFO、WARN=WARNING、ERROR、FATAL=CRITICAL)
  • 格式二

    import logging
    
    file_handler = logging.FileHandler('demo.log', mode='a', encoding='utf-8')
    logging.basicConfig(
        format='%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
        handlers=[file_handler],
        level=logging.ERROR,
    )
    
    logging.error('aaron')
    
    # 輸出日誌文件中的內容
    2019-11-08 21:08:37-root-ERROR-demo16:aaron
    
    # 注意:此格式不能讓日誌內容同時從控制檯輸出到屏幕上
  • 切分大日誌文件

    import time
    import logging
    from logging import handlers
    
    logger = logging.Logger('Alex', level=logging.ERROR)
    # 建立一個文件操做符,包含文件名稱,文件切分的時間單位和間隔以及文件的編碼方式
    # 切分的時間單位when能夠選擇:S(秒)、M(分)、H(時)、D(天)
    file_handler = handlers.TimedRotatingFileHandler('split.log',when='S', interval=5, encoding='utf-8')
    fmt = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s')
    file_handler.setFormatter(fmt)
    logger.addHandler(file_handler)
    
    for i in range(1, 100):
        time.sleep(1)
        logger.error(str(i))
相關文章
相關標籤/搜索