Python經常使用模塊

Python經常使用模塊

  1. 時間模塊(time)node

    和時間有關係的咱們就要用到時間模塊。在使用模塊以前,應該首先導入這個模塊。python

    # 經常使用方法
    import time
    time.sleep(secs)
    # 使線程延遲指定的時間運行,時間單位爲秒
    
    time.time()
    # 獲取當前時間戳
    1. 在Python表示時間的三種方式:
      1. 時間戳:一般來講,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。咱們運行「type(time.time())」,返回的是float類型。正則表達式

      2. 格式化時間:"2019-07-02"算法

      3. 結構化時間:struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)shell

        # Python中時間日期格式化符號
        %y 兩位數的年份表示(00-99)
        %Y 四位數的年份表示(000-9999)
        %m 月份(01-12)
        %d 月內中的一天(0-31)
        %H 24小時制小時數(0-23)
        %I 12小時制小時數(01-12)
        %M 分鐘數(00=59)
        %S 秒(00-59)
        %a 本地簡化星期名稱
        %A 本地完整星期名稱
        %b 本地簡化的月份名稱
        %B 本地完整的月份名稱
        %c 本地相應的日期表示和時間表示
        %j 年內的一天(001-366)
        %p 本地A.M.或P.M.的等價符
        %U 一年中的星期數(00-53)星期天爲星期的開始
        %w 星期(0-6),星期天爲星期的開始
        %W 一年中的星期數(00-53)星期一爲星期的開始
        %x 本地相應的日期表示
        %X 本地相應的時間表示
        %Z 當前時區的名稱
        %% %號自己
        import time
        # 時間戳
        ret = time.time()
        print(ret)
        
        # 結構化時間
        ret = time.localtime()
        print(ret)
        
        # 格式化時間
        ret= time.strftime('%Y-%m-%d')
        print(ret)

        小結:時間戳是計算機可以識別的時間;時間字符串是人可以看懂的時間;結構化時間則是用來操做時間的json

    2. 幾種格式之間的轉換

    import time
    # 一、時間戳 ——> 結構化時間
    timestamp = time.time()
    struct_time = time.localtime(timestamp)
    
    # 二、結構化時間 ——> 格式化時間
    format_time = time.strftime("%Y-%m-%d", struct_time)
    
    # 三、格式化時間 ——> 結構化時間
    struct_time = time.strptime(format_time, "%Y-%m-%d")
    
    # 四、結構化時間 ——> 時間戳
    stamptime = time.mktime(struct_time)
  2. random模塊bash

    import random
    
    # 一、獲取隨機整數(閉區間)
    random.randint(3,5)
    
    # 二、獲取隨機整數(左閉右開)
    random.randrange(3, 5)
    
    # 三、獲取隨機0-1以內隨機小數
    random.random()
    
    # 四、獲取指定範圍內的隨機小數
    random.uniform(1, 3)
    
    # 五、隨機選擇一個並返回值
    lst = [1, "dogfa", {"age": 18}, [1,2,3], ("哈哈",)]
    random.choice(lst)
    
    # 六、隨機選擇多個並返回值,返回個數取決於第二個參數
    lst = [1, "dogfa", {"age": 18}, [1,2,3], ("哈哈",)]
    random.sample(lst, 2)
    
    # 七、打亂列表順序
    lst = [1, "dogfa", {"age": 18}, [1,2,3], ("哈哈",)]
    random.shuffle(lst)
  3. sys模塊數據結構

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

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

    os模塊是與操做系統交互的一個接口

    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.system("bash command")  運行shell命令,直接顯示
    os.popen("bash command).read()  運行shell命令,獲取執行結果
    os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑
    os.chdir("dirname")  改變當前腳本工做目錄;至關於shell下cd
    
    os.path
    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的大小
    
    os.sep    輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/"
    os.linesep    輸出當前平臺使用的行終止符,win下爲"\r\n",Linux下爲"\n"
    os.pathsep    輸出用於分割文件路徑的字符串 win下爲;,Linux下爲:
    os.name    輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix'

    注意:os.stat('path/filename') 獲取文件/目錄信息 的結構說明

    stat 結構:
    
    st_mode: inode 保護模式
    st_ino: inode 節點號。
    st_dev: inode 駐留的設備。
    st_nlink: inode 的連接數。
    st_uid: 全部者的用戶ID。
    st_gid: 全部者的組ID。
    st_size: 普通文件以字節爲單位的大小;包含等待某些特殊文件的數據。
    st_atime: 上次訪問的時間。
    st_mtime: 最後一次修改的時間。
    st_ctime: 由操做系統報告的"ctime"。在某些系統上(如Unix)是最新的元數據更改的時間,在其它系統上(如Windows)是建立時間(詳細信息參見平臺的文檔)。
  5. re模塊

    import re
    
    # 將全部知足正規則的值查詢出來,並返回一個列表
    ret = re.findall("a", "abcsasdasdafas")
    print(ret)
    # ['a', 'a', 'a', 'a', 'a']
    
    # 將知足正則規則的第一個值查詢出來,返回的是一個包含匹配結果的對象,能夠經過obj.group()方法取出知足匹配結果的值,若是沒有匹配到值,則返回None
    ret = re.search("a", "abcsasdasdafas")
    print(ret)
    # <_sre.SRE_Match object; span=(0, 1), match='a'>
    print(ret.group())
    # a
    
    # 與search同樣,只不過match只會從頭開始匹配,至關於re.search("^a")
    ret = re.match("a", "abcsasdasdafas")
    print(ret)
    # <_sre.SRE_Match object; span=(0, 1), match='a'>
    print(ret.group())
    # a
    
    # 對知足正則規則的值進行分割
    ret = re.split("[ab]", "abcd")
    print(ret)
    # ['', '', 'cd']
    
    
    # 將知足正則規則的值替換成W,參數1表示只替換3個
    ret = re.sub("\d", "W", "ad1a212af5a4s54a", 3)
    print(ret)
    # adWaWW2af5a4s54a
    
    # 和re.sub同樣,只不過返回的值是一個元祖,裏面包含替換的次數
    ret = re.subn("\d", "W", "ad1a212af5a4s54a", 3)
    print(ret)
    # ('adWaWW2af5a4s54a', 3)
    
    # 將正則表達式編譯成一個正則表達式對象,再次解析正則表達式時將節省時間
    obj = re.compile("\d{3}")
    ret = obj.search("123das45asd879asd")
    print(ret.group())
    # 123
    
    # 返回值是一個迭代器,節省空間
    ret = re.finditer("\d", "123affdsfdsds5f4sdf")
    print([i.group() for i in ret])
    # ['1', '2', '3', '5', '4']

    注意:

    1. findall的優先級查詢

      import re
      
      ret_lsit = re.findall("www.(baidu|2345).com", "www.baidu.com")
      print(ret_lsit)
      # ['baidu']       這是由於findall會優先把匹配結果組裏內容返回,若是想要匹配結果,取消權限便可
      
      ret_lsit = re.findall("www.(?:baidu|2345).com", "www.baidu.com")
      print(ret_lsit)
      # ['www.baidu.com']
    2. split的優先級查詢

      import re
      
      ret_lsit = re.split("\d+", "dogfa38oldniu48djb27")
      print(ret_lsit)
      # ['dogfa', 'oldniu', 'djb', '']
      
      ret_lsit = re.split("(\d+)", "dogfa38oldniu48djb27")
      print(ret_lsit)
      # ['dogfa', '38', 'oldniu', '48', 'djb', '27', '']
      
      #在匹配部分加上()以後所切出的結果是不一樣的,
      #沒有()的沒有保留所匹配的項,可是有()的卻可以保留了匹配的項,
      #這個在某些須要保留匹配部分的使用過程是很是重要的。

    re模塊擴展

    1. 匹配標籤

      import re
      
      ret = re.search("<(?P<tags>\w+)>.*</(?P=tags)>", "<h1>哈哈哈</h1>")
      print(ret.group())            # <h1>哈哈哈</h1>
      print(ret.group("tags"))  # h1
      
      #能夠在分組中利用?<name>的形式給分組起名字
      #獲取的匹配結果能夠直接用group('名字')拿到對應的值
    2. 匹配整數

      import re
      
      ret = re.findall(r"-?\d+\.\d+|(-?\d+)", "1-2*(60+(-40.35/5)-(-4*3))")
      print(ret)        # ['1', '-2', '60', '', '5', '-4', '3']
      ret.remove("")
      print(ret)        # ['1', '-2', '60', '5', '-4', '3']
    3. 數字匹配

      一、 匹配一段文本中的每行的郵箱
            http://blog.csdn.net/make164492212/article/details/51656638
      
      二、 匹配一段文本中的每行的時間字符串,好比:‘1990-07-12’;
      
         分別取出1年的12個月(^(0?[1-9]|1[0-2])$)、
         一個月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
      
      三、 匹配qq號。(騰訊QQ號從10000開始)  [1,9][0,9]{4,}
      
      四、 匹配一個浮點數。       ^(-?\d+)(\.\d+)?$   或者  -?\d+\.?\d*
      
      五、 匹配漢字。             ^[\u4e00-\u9fa5]{0,}$ 
      
      六、 匹配出全部整數

      在線測試工具: http://tool.chinaz.com/regex/

  6. 序列化模塊

    1. 什麼是序列化?

      將其它數據格式內容轉換成一個字符串的過程就叫作序列化

    2. 序列化的目的

      1. 以某種存儲形式使自定義對象持久化
      2. 將對象從一個地方傳遞到另外一個地方
      3. 使程序更具備維護性

    3. Json

      Json模塊提供了四個功能:dumps、dump、loads、load

      在Python中大部分類型數據不能轉換成Json格式,只有少部分如:str,list,dict,int 類型能夠轉換成Json格式數據類型,且Json格式中字典的key值必定爲字符串類型,在Json中字符串類型全都用雙引號(" ")表示。

      1. dumps 和 loads

        import json
        
        dic = {"name":"dogfa", "age":18, "gender":"male", 1:2}
        
        json_dic = json.dumps(dic)     # 序列化:將一個字典轉換成一個字符串
        print(json_dic)
        # {"name": "dogfa", "age": 18, "gender": "male", "1": 2}
        
        new_dic = json.loads(json_dic)    # 反序列化:將Json格式數據轉換成字典格式數據
        print(new_dic)
        # {'name': 'dogfa', 'age': 18, 'gender': 'male', '1': 2}
        
        # 對比先後轉換咱們發如今轉換成Json格式的時候,key所有轉換成了字符串類型,而對這個結果再次轉換回字典格式類型key表現的形式依舊是字符串類型。
      2. dump 和 load

        import json
        
        dic = {"name":"dogfa", "age":18, "gender":"male", 1:2}
        
        f = open("file/dog", mode="w", encoding="utf-8")
        json.dump(dic, f, ensure_ascii=False) 
        # dump方法接收一個文件句柄,直接將字典轉換成json字符串寫入文件
        f.close()
        # ensure_ascii:當它爲True的時候,全部非ASCII碼字符顯示爲\uXXXX序列,只需在dump時將ensure_ascii設置爲False便可,此時存入Json的中文便可正常顯示。
        
        f = open("file/dog", mode="r", encoding="utf-8")
        ret = json.load(f)
        # load方法接收一個文件句柄,直接將文件中的json字符串轉換成數據結構返回
        print(ret)

        注意:能夠dump屢次數據到文件中,可是load不出來了。想dump多個數據進文件,用dumps。

        import json
        
        dic = {"name":"dogfa", "age":18, "gender":"male", 1:2}
        lst = [1, 2, 3, 4]
        
        # 存值
        f = open("file/dog", mode="w", encoding="utf-8")
        json_dic = json.dumps(dic, ensure_ascii=False)
        json_lst = json.dumps(lst, ensure_ascii=False)
        f.write(json_dic + "\n")
        f.write(json_lst + "\n")
        
        # 取值
        f = open("file/dog", mode="r", encoding="utf-8")
        for line in f:
            print(json.loads(line))
    4. pickle

      pickle模塊提供了四個功能:dumps、dump(序列化,存)、loads(反序列化,讀)、load (不只能夠序列化字典,列表...能夠把Python中基本上全部的數據類型序列化

      import pickle
      
      dic = {"name":"dogfa", "age":18, "gender":"male", 1:2}
      
      pic_dic = pickle.dumps(dic)
      print(pic_dic)   # 一串bytes類型內容
      
      new_dic = pickle.loads(pic_dic)
      print(new_dic)   # {"name":"dogfa", "age":18, "gender":"male", 1:2}
      
      
      # pickle還能夠存儲對象
      import time
      struct_time = time.localtime()
      print(type(struct_time), struct_time.tm_mday)
      # <class 'time.struct_time'> 3
      
      f = open("file/dog", mode="wb")
      pickle.dump(struct_time, f)
      
      f = open("file/dog", mode="rb")
      new_struct_time = pickle.load(f)
      print(new_struct_time.tm_mday)   # 3

      總結:當序列化的內容是列表或者字典,推薦使用json模塊。但若是出於某種緣由你不得不序列化其餘的數據類型,而將來你還會用Python對這個數據進行反序列化的話,那麼就可使用pickle。

  7. hashliib模塊

    1. 什麼是hash?

    hash是一種算法(3.x裏代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),該算法接受傳入的內容,通過運算獲得一串hash值。

    1. hash值得特色

      1. 只要傳入的內容同樣,獲得的hash值必然同樣

      2. 不能由hash值返解成內容

      3. 只要使用的hash算法不變,不管校驗的內容有多大,獲得的hash值長度是固定的

    MD5是最多見的摘要算法,速度很快,生成結果是固定的128 bit字節,一般用一個32位的16進制字符串表示

    import hashlib
    
    md5_obj = hashlib.md5()
    md5_obj.update("dogfa".encode("utf-8"))
    ret = md5_obj.hexdigest()
    print(ret)
    # df4a1f9d8687dfaac078aa0a24a1ca29
    
    md5_obj.update("sb".encode("utf-8"))
    print(md5_obj.hexdigest())
    # 819bc0bd1c65f19111f95462e0560629
    
    md5_obj = hashlib.md5()
    md5_obj.update("dogfasb".encode("utf-8"))
    ret = md5_obj.hexdigest()
    print(ret)
    # 819bc0bd1c65f19111f95462e0560629
    
    # 注意:把一段很長的數據update屢次,與一次update這段長數據,獲得的結果同樣
    # 可是update屢次爲校驗大文件提供了可能。

    因爲經常使用口令的MD5值很容易被計算出來,因此,要確保存儲的用戶口令不是那些已經被計算出來的經常使用口令的MD5,這一方法經過對原始口令加一個複雜字符串來實現,俗稱「加鹽」。

    import hashlib
    
    md5_obj = hashlib.md5("我是鹽".encode("utf-8"))
    md5_obj.update("dogfasb".encode("utf-8"))
    ret = md5_obj.hexdigest()
    print(ret)
    # 2c39693230a2e0ff4f98163e5b177a1c
  8. logging模塊(日誌模塊)

    1. 日誌級別

      CRITICAL = 50 #FATAL = CRITICAL
      ERROR = 40
      WARNING = 30 #WARN = WARNING
      INFO = 20
      DEBUG = 10
      NOTSET = 0 #不設置
    2. 默認級別爲warning,默認打印到終端

      import logging
      
      logging.debug('調試debug')
      logging.info('消息info')
      logging.warning('警告warn')
      logging.error('錯誤error')
      logging.critical('嚴重critical')
      
      '''
      WARNING:root:警告warn
      ERROR:root:錯誤error
      CRITICAL:root:嚴重critical
      '''
    3. logger對象配置

      import logging
      
      # 建立一個日誌格式
      format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
      
      logger = logging.getLogger("sb")
      
      filehandle = logging.FileHandler("file/dog", encoding="utf-8")
      streamhandle = logging.StreamHandler()
      
      filehandle.setFormatter(format)
      streamhandle.setFormatter(format)
      
      logger.addHandler(filehandle)
      logger.addHandler(streamhandle)
      logger.setLevel(logging.DEBUG)
      
      
      logger.debug("我是debug")
      logger.info("我是info")
      logger.warning("我是warning")
      logger.error("我是error")
      logger.critical("我是critical")
    4. 配置參數

      logging.basicConfig()函數中可經過具體參數來更改logging模塊默認行爲,可用參數有:
      
      filename:用指定的文件名建立FiledHandler,這樣日誌會被存儲在指定的文件中。
      filemode:文件打開方式,在指定了filename時使用這個參數,默認值爲「a」還可指定爲「w」。
      format:指定handler使用的日誌顯示格式。
      datefmt:指定日期時間格式。
      level:設置rootlogger的日誌級別
      stream:用指定的stream建立StreamHandler。能夠指定輸出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認爲sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。
      
      format參數中可能用到的格式化串:
      %(name)s Logger的名字
      %(levelno)s 數字形式的日誌級別
      %(levelname)s 文本形式的日誌級別
      %(pathname)s 調用日誌輸出函數的模塊的完整路徑名,可能沒有
      %(filename)s 調用日誌輸出函數的模塊的文件名
      %(module)s 調用日誌輸出函數的模塊名
      %(funcName)s 調用日誌輸出函數的函數名
      %(lineno)d 調用日誌輸出函數的語句所在的代碼行
      %(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
      %(relativeCreated)d 輸出日誌信息時的,自Logger建立以 來的毫秒數
      %(asctime)s 字符串形式的當前時間。默認格式是 「2003-07-08 16:49:45,896」。逗號後面的是毫秒
      %(thread)d 線程ID。可能沒有
      %(threadName)s 線程名。可能沒有
      %(process)d 進程ID。可能沒有
      %(message)s用戶輸出的消息
    5. 追蹤錯誤提示信息

      import traceback
      
      try:
          a
      except Exception as e:
          print(traceback.format_exc())
      
      
      # Traceback (most recent call last):
      #   File "E:/Python Code//日誌文件.py", line 4, in <module>
      #     a
      # NameError: name 'a' is not defined
  9. collections模塊

    在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

    1. deque(雙端隊列)

      使用list存儲數據時,按索引訪問元素很快,可是插入和刪除元素就很慢了,由於list是線性存儲,數據量大的時候,插入和刪除效率很低。

      deque是爲了高效實現插入和刪除操做的雙向列表,適合用於隊列和棧

      from _collections import deque
      
      dq = deque(["a", "b", "c"])
      dq.append("d")
      dq.appendleft("e")      # 在隊列的左端插入
      print(dq)
      # deque(['e', 'a', 'b', 'c', 'd'])
      
      print(dq[2])        # 一樣能夠經過索引取值
      # b

      deque除了實現list的append()和pop()外,還支持appendleft()和popleft(),這樣就能夠很是高效地往頭部添加或刪除元素。

      # 對比列表和雙端隊列的插入速度
      import time
      from collections import deque
      
      lst = list(range(1000000000))
      
      # 列表插入數據時間
      start_time = time.time()
      lst.insert(0, 1)
      end_time = time.time()
      
      speed_time = round(end_time - start_time, 2)
      print("lst_time:", speed_time)
      
      
      # 雙端隊列插入數據時間
      dq = deque()
      dq.extend(lst)
      
      start_time = time.time()
      dq.insert(0, 1)
      end_time = time.time()
      
      speed_time = round(end_time - start_time)
      print("dq_time:", speed_time)
    2. namedtuple

      咱們知道tuple能夠表示不變集合,例如,一個點的二維座標就能夠表示成:

      tu = (1, 2)

      可是,看到(1, 2),很難看出這個tuple是用來表示一個座標的。

      這時,namedtuple就派上了用場:

      from collections import namedtuple
      
      Point = namedtuple('Point', ['x', 'y'])
      p = Point(1, 2)
      
      print(p.x)   # 1
      print(p.y)   # 2

.........

相關文章
相關標籤/搜索