WEEK5:經常使用模塊學習

  • 定義
    • 模塊:用來從邏輯上組織python代碼(變量,函數,類,邏輯:實現一個功能),本質就是.py結尾的python文件
    • 包:用來從邏輯上組織組織模塊的,本質就是一個目錄(必須帶有一個__init__.py文件)
  • 導入方法
    • 導入模塊
      • import module_name,module2_name  #導入模塊
      • from module_alex import *  #導入module_alex模塊中全部的方法,不建議使用此方法
      • from module_alex import logger as logger_alex  #導入模塊中的特定方法logger並將其重命名logger_alex
      • from module_alex import logger1,logger2  #導入多個方法
    • 導入包
      • import package_test #packet_test爲文件夾名字,內部還有不少模塊和一個__init__.py文件
  • import的本質(路徑搜索和搜索路徑)
    • 導入模塊的本質就是把python文件解釋一遍(將模塊賦給一個變量,變量的名字就是模塊的名字)
    • 導入包的本質就是執行該包下的__init__.py文件
      __init__.py文件中必須將該文件夾下面的模塊所有「from . import 模塊名字」一遍,不然以後沒法調用
  • 導入優化
    • 將本身的模塊和包的路徑添加到sys.path這個列表的最前面
      x=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
      sys.path.insert(x) #插入最前面
      sys.path.append(x) #插入最後面
  • 模塊分類
    • 標準庫(內置模塊)
      • 時間模塊time與datetime
        • time
          import time
          • 時間方式  
            • 時間戳 time.time()
            • 格式化的時間字符串
            • 元組(struct_time,共九個元素:年,月,日,時,分,秒,一週的第幾天,一年的第幾天,是不是夏令時)time.localtime()
          • 方法
            • timezone() #當前時區時間與utc相差多少秒
            • gmtime() #將時間戳轉換成標準時間(格林尼治時間)元組struct_time
            • localtime() #將時間戳轉換成本地時間元組struct_time
              與其相反的函數是mktime()
            • strftime(格式,struct_time) #將元組時間轉換成格式化的時間字符串,%Y年%m月%d天%H小時等
              與其相反的函數是strptime(字符串,格式)
            • asctime() #將元組時間轉換成「Sat Aug 14:59:45 2016」格式
            • ctime() #將時間戳轉換成「Sat Aug 14:59:45 2016」格式
            • sleep() #休眠幾秒
        • datetime
          import datetime
          • datatime.datatime.now()  #獲取當前時間
          • datetime.datatime.now()+datetime.timedelta(3) #3天后的時間
          • datetime.datatime.now()+datetime.timedelta(3) #3天前的時間
          • datetime.datatime.now()+datetime.timedelta(hours=3) #3個小時後的時間
          • datetime.datatime.now()+datetime.timedelta(hours=-3) #3個小時前的時間 #分鐘是minutes
      • random #隨機數
        • random.random() #隨機數0-1之間
        • random.randint(1,3) #隨機1~2之間的整數
        • random.choice("序列")  #從序列中獲取隨意值
        • random.sample("序列",長度) #從序列中隨機取出指定長度的元素
        • random.uniform(1,10) #取1-10之間的隨意浮點數
        • random.shuffle() #將一個有序的序列從新排列
        • 生成驗證碼
           1 import random
           2 checkcode=''
           3 for i in range(4):
           4     current=random.randrange(0,4)
           5     if current==i:
           6         tmp=chr(random.randint(65,90))
           7     else:
           8         tmp=random.randint(0,9)
           9     checkcode+=str(tmp)
          10 print(checkcode)
          View Code
      • os #提供對操做系統進行調用的接口
        • os.getcwd() #獲取當前的操做目錄
        • os.chdir("C:\\Users") #改變當前腳本工做目錄
        • os.curdir() #返回當前目錄
        • os.pardir() #返回當前目錄的父目錄
        • os.makedirs() #遞歸的建立目錄
        • os.removedirs() #遞歸的刪除目錄
        • os.mkdir() #非遞歸建立目錄
        • os.rmdir() #刪除單級空目錄
        • os.listdir() #列出當前目錄的內容列表
        • os.remove() #刪除一個文件
        • os.rename() #重命名文件或者目錄
        • os.stat() #獲取文件目錄的信息
        • os.sep #輸出操做系統特定的路徑分隔符,win下爲「\\」,linux下爲「/」
        • os.linesep #輸出操做系統特定的路徑分隔符,win下爲「\t\n」,linux下爲「\n」
        • os.pathsep #輸出用於分割文件路徑的字符串
        • os.name 輸出字符串指示當前使用平臺,nt->win,posix->linux
        • os.system("cmd命令")  #運行cmd命令
        • os.environ #獲取系統環境變量
        • os.path.abspath(path) #返回path的絕對路徑
        • os.path.split(path) #將path分割成目錄和名稱二元組返回
        • os.path.dirname(path) #返回path的目錄,其實就是os.path.split(path)的第一個元素
        • os.path.basename(path) #返回path最後的文件名,其實就是os.path.split(path)的第二個元素
        • os.path.exists(path) #判斷path是否存在
        • os.path.isabs(path) #判斷path是否爲絕對路徑
        • os.path.isfile(path) #判斷是否爲文件
        • os.path.join(path1,path2,...) #將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略
        • os.path.getatime() #返回最後存取時間
        • os.path.getatime() #返回最後修改時間
      • sys
        • sys.argv #命令行參數list,第一個元素是程序自己路徑
        • sys.exit(n) #退出程序,正常退出時exit(0)
        • sys.version #獲取python解釋程序的版本信息
        • sys.maxint #最大的Int值
        • sys.path #返回模塊的搜索路徑,
        • sys.platform #返回操做系統平臺名稱
      • shutil #高級的文件、文件夾、壓縮包處理模塊
        • shutil.copyfileobj() #將文件內容拷貝到另外一個文件,能夠是一部份內容
        • shutil.copyfile() #拷貝文件
        • shutil.copymode() #僅拷貝權限,內容、組、用戶均不變
        • shutil.copystat() #拷貝狀態信息,包括mode,utime,mtime,atime等信息
        • shutil.copy() #拷貝文件和權限
        • shutil.copy2() #拷貝文件和狀態信息
        • shutil.copytree() #遞歸的拷貝文件
        • shutil.rmtree() #遞歸的刪除目錄
        • shutil.move() #遞歸的去移動文件
        • shutil.make_archive(壓縮包的文件名,壓縮包種類,被壓縮的文件或目錄) #建立壓縮包並返回文件路徑
      • shelve #是一個簡單的k,v將內存數據經過文件持久化的模塊,能夠持久化任何pickle可支持的python數據格式
      • xml處理模塊
        import xml.etree.ElementTree as ET
        tree=ET.parse("xmltest.xml")
        root=tree.getroot()
        print(root) #內存地址
        print(root.tag) #最外面的標籤名

        #遍歷xml文檔
        for child in root:
            print(child.tag,child.attrib)
            for i in child:
                print(i.tag,i.text)

        #只遍歷year節點
        for node in root.iter('year'):
            print(node.tag,node.text)

        #修改,把每一個year的值+1
        for node in root.iter("year"):
            new_year=int(node.text)+1
            node.text=str(new_year)
            node.set("updated_by","Alex")
        tree.write("xmltest.xml") #寫回源文件

        #刪除node,刪除排名50之後的
        for country in root.findall("country"):
            rank=int(country.find('rank').text)
            if rank > 50:
                root.remove(country)
        tree.write("output.xml") #寫入另一個文件

        #建立xml文檔
        new_xml = ET.Element("personinfolist")
        personinfo = ET.SubElement(new_xml, "personinfo", attrib={"enrolled": "yes"})
        name = ET.SubElement(personinfo, "name")
        name.text = "Alex Li"
        age = ET.SubElement(personinfo, "age", attrib={"checked": "no"})
        sex = ET.SubElement(personinfo, "sex")
        age.text = '56'
        personinfo2 = ET.SubElement(new_xml, "personinfo", attrib={"enrolled": "no"})
        name = ET.SubElement(personinfo2, "name")
        name.text = "Oldboy Ran"
        age = ET.SubElement(personinfo2, "age")
        age.text = '19'
        et = ET.ElementTree(new_xml)  # 生成文檔對象
        et.write("test.xml", encoding="utf-8", xml_declaration=True)
        ET.dump(new_xml)  # 打印生成的格式
      • configparser模塊 #用於生成和修改常見配置文檔
        • 配置文件以下
          [DEFAULT]
          ServerAliveInterval = 45
          Compression = yes
          CompressionLevel = 9
          ForwardX11 = yes
          [bitbucket.org]
          User = hg
          [topsecret.server.com]
          Port = 50022
          ForwardX11 = no
        • 生成配置文件
          import configparser
          config=configparser.ConfigParser()
          config["DEFAULT"]={'ServerAliveInterval': '45',
                                'Compression': 'yes',
                               'CompressionLevel': '9'}
          config['bitbucket.org']={}
          config['bitbucket.org']['User']='hg'
          config['topsecret.server.com']={}
          topsecret=config['topsecret.server.com']
          topsecret['Host Port']='50022'     # mutates the parser
          topsecret['ForwardX11']='no'  # same here
          config['DEFAULT']['ForwardX11']='yes'
          with open('example.ini', 'w') as configfile:
             config.write(configfile)

        • 讀出配置文件
          import configparser
          conf=configparser.ConfigParser()
          conf.read("example.ini")
          print(conf.defaults())
          print(conf['bitbucket.org']['user'])
        • 刪除
          sec=conf.remove_section('bitbucket.org')
          conf.write(open("example.ini",'w'))
      • hashlib模塊 #用於加密相關的操做,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法
        import hashlib
        • md5
          hash = hashlib.md5()
          hash .update( 'admin' )
          print ( hash .hexdigest())
        • sha1
          hash = hashlib.sha1()
          hash .update( 'admin' )
          print ( hash .hexdigest())
        •  
          sha256
          hash = hashlib.sha256()
          hash .update( 'admin' )
          print ( hash .hexdigest())
        • sha384
          hash = hashlib.sha384()
          hash .update( 'admin' )
          print ( hash .hexdigest())
        • sha512
          hash = hashlib.sha512()
          hash .update( 'admin' )
          print ( hash .hexdigest())
        • python 還有一個 hmac 模塊,它內部對咱們建立 key 和 內容 再進行處理而後再加密。散列消息鑑別碼,簡稱HMAC,是一種基於消息鑑別碼MAC(Message Authentication Code)的鑑別機制。使用HMAC時,消息通信的雙方,經過驗證消息中加入的鑑別密鑰K來鑑別消息的真僞;通常用於網絡通訊中消息加密,前提是雙方先要約定好key,就像接頭暗號同樣,而後消息發送把用key把消息加密,接收方用key + 消息明文再加密,拿加密後的值 跟 發送者的相對比是否相等,這樣就能驗證消息的真實性,及發送者的合法性了。
          import hmac
          h = hmac.new(b'12345', 'you are 250你是'.encode(encoding="utf-8"))
          print(h.hexdigest())
      • re模塊  #正則
        • 經常使用正則表達式符號
          • '.'    #默認匹配除\n以外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行
          • '^'    #匹配字符串開頭,若指定flags MULTILINE,這種也能夠匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
          • '$'    #匹配字符串結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也能夠
          • '*'    #匹配*號前的字符0次或屢次,re.findall("ab*","cabb3abcbbac")  結果爲['abb', 'ab', 'a']
          • '+'    #匹配前一個字符1次或屢次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']
          • '?'    #匹配前一個字符1次或0
          • '{m}'    #匹配前一個字符m次
          • '{n,m}'    #匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果['abb', 'ab', 'abb']
          • '|'    #匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC'
          • '(...)'    #分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c
          • '\A'    #只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
          • '\Z'    #匹配字符結尾,同$
          • '\d'    #匹配數字0-9
          • '\D'    #匹配非數字
          • '\w'    #匹配[A-Za-z0-9]
          • '\W'    #匹配非[A-Za-z0-9]
          • 's'    #匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'
          • '(?P<name>...)'    #分組匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 結果{'province': '3714', 'city': '81', 'birthday': '1993'}
        • 經常使用匹配語法
          • re.match #從開頭匹配
          • re.search #匹配包含,只匹配第一次出現的值
          • re.findall #把全部匹配到的字符放到以列表中的元素返回
          • re.splitall #以匹配到的字符當作列表分隔符
          • re.sub #匹配字符並替換
          • 匹配模式:
            flags=匹配模式
            • re.I(re.IGNORECASE) #忽略大小寫(括號內是完整寫法)
            • re.M(re.MULTILINE) #多行模式,改變^和$的行爲
            • re.S(re.DOTALL) #點任意匹配模式,改變.的行爲
                
    • 開源模塊
    • 自定義模塊
相關文章
相關標籤/搜索