模組的研究
阿新 • • 發佈:2018-11-27
本文主要對模組的初步識別,以及re模組、sys模組、time模組,os模組的初步介紹。
1.模組的介紹
''' 整體說明: 01 模組是一系列常用功能的集合體,一個py檔案就是一個模組。主要是將一些相同功能的封裝到一個py檔案中,誰有誰拿。 02 為什麼要使用模組。 (1)從檔案級別組織程式,更方便管理。不僅可以把這些檔案當做指令碼去執行,還可以把他們當做模組匯入到其他的模組中,實現了 功能的重複利用。 (2)拿來主義,提高開發效率。避免了重複造輪子。 03 import的使用 (1)模組中包含的可執行語句和函式,只在模組名第一次遇到匯入import語句時才執行。 (2)import語句可以在程式中的任意位置使用,且針對同一模組可以重複使用import進行多次匯入。 (3)但是,第一次模組名載入到記憶體後,後續的import語句僅是對已經載入到記憶體中的模組增加了一次引用,不會重複執行模組中 的語句和函式。 (4)執行檔案和被引用模組: (a)執行檔案:直譯器執行的檔案。 (b)被引用檔案:import 04 模組被引用的時候發生了三件事 (1)為原始檔建立新的名稱空間。 (2)引用模組中的所有內容都載入到記憶體中。 (3)通過模組名+“.”的方式去引用模組中的物件(可執行的語句和函式) 05 為模組起別名的作用。 (1)將模組名較長的變成較短的。 (2) 拓展程式碼。 06 多個模組匯入 07 模組的引用順序:記憶體 ---> 內建模組(os,time sys..) ---> sys.path (1)python直譯器在啟動時會自動載入一些模組到記憶體中,可以使用sys.modules檢視。 08 可以使用__all__來控制*(用來發布新版本),在原始檔中指定兩個變數即__all__=['money','read1'],其他匯入的時候只能匯入該兩個變數 09 py檔案的兩種功能。 (1)一:指令碼,一個檔案就是整個程式,用來被執行。 (2)二:模組,檔案中存放著一堆功能,用來被匯入執行。 10 python中我們內建了全域性變數:__name__ (1)當檔案被當做指令碼執行時:__name__等於“__main” (2)當檔案被當做模組匯入時:__name__等於模組名。 (3)作用:用來控制py檔案在不同的應用場景下執行不同的邏輯(或者是在模組檔案中測試程式碼)''' # 01 第一次模組名載入到記憶體後,後續的import語句僅是對已經載入到記憶體中的模組增加了一次引用,不會重複執行模組中的語句和函式。 import mayugang import mayugang import mayugang ''' 執行結果:只打印一次 from the mayugang.py ''' # 02 為模組起別名 # (1)將模組名較長的變成較短的。 import mayugang as myg myg.read1() # (2)有利於程式碼的拓展和優化。 import mysql1 import oracle1 sql = input("請輸入:").strip() if sql == 'mysql1': import mysql1 as db elif sql == 'oracle1': import oracle1 as db db.sentence() # (3)多模組匯入的形式 import os import time import pickle (4)from ...import ... # 優點:方便使用。 # 缺點:可能會與執行檔案產生衝突。 # 不建議使用,或者可以在一定條件下使用。 name = '李蘋' from mayugang import read1, name # 將模組中的name = '馬玉剛' 覆蓋了name = '李蘋'。read1() # print(name) print(name) ''' 執行結果:name被覆蓋。 mayugang模組: 馬玉剛 馬玉剛 馬玉剛 ''' # (5)from 模組名 import *:代表引用全部物件(可執行物件和函式) # 不建議使用以上方法進行全部引用。 # (6)模組的查詢順序:記憶體中已經載入的模組->內建模組->sys.path路徑中包含的模組 ''' 模組的查詢順序 1、在第一次匯入某個模組時(比如spam),會先檢查該模組是否已經被載入到記憶體中(當前執行檔案的名稱空間對應的記憶體),如果有則直接引用 ps:python直譯器在啟動時會自動載入一些模組到記憶體中,可以使用sys.modules檢視 2、如果沒有,直譯器則會查詢同名的內建模組 3、如果還沒有找到就從sys.path給出的目錄列表中依次尋找spam.py檔案。 ''' import sys print(sys.path) # 列印自定義模組 print(sys.modules) # python直譯器執行時自動載入到記憶體的一些模組 sys.path.append("module.zip") # 增加自定義模組,增加後儘可以引用模組中的物件(可執行程式和函式) print(sys.path) # windows下的路徑需要加r開頭,否則會語法錯誤。 sys.path.insert(0,r'C:\Users\Administrator\PycharmProjects\a') # (7)找到m1檔案的兩種方式: # 方式一: import sys sys.path.append("D:\pythonweekend24\day07\mk") import m1 m1.func1() # 方式二: from mk import m1 m1.func1()
2.re模組
''' 整體說明: 01 什麼是正則? 正則就是用一些具有特殊含義的符號組合到一起(稱為正則表示式)來描述字元或者字串的方法。或者說:正則就是用來描述一 類事物的規則。(在Python中)它內嵌在Python中,並通過 re 模組實現。正則表示式模式被編譯成一系列的位元組碼,然後由用 C 編寫的匹配引擎執行。 02 匹配規則說明: (1)\w 匹配字母(包含中文)或數字或下劃線 (2)\W 匹配非字母(包含中文)或數字或下劃線 (3)\s 匹配任意的空白符 (4)\S 匹配任意非空白符 (5)\d 匹配數字 (6)\D 匹配非數字 (7)\A 從字串開頭匹配 (8)\z 匹配字串的結束,如果是換行,只匹配到換行前的結果 (9)\Z 匹配字串的結束 (10)\n 匹配一個換行符 (11)\t 匹配一個製表符 (12)^ 匹配字串的開始 (13)$ 匹配字串的結尾 (14). 匹配任意字元,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字元。 (15)[...] 匹配字元組中的字元 (16)[^...] 匹配除了字元組中的字元的所有字元 (17)* 匹配0個或者多個左邊的字元。 (18)+ 匹配一個或者多個左邊的字元。 (19)? 匹配0個或者1個左邊的字元,非貪婪方式。 (20){n} 精準匹配n個前面的表示式。 (21){n,m} 匹配n到m次由前面的正則表示式定義的片段,貪婪方式 (22)a|b 匹配a或者b。 (23)() 匹配括號內的表示式,也表示一個組 ''' import re # \w 匹配字母(包含中文)或數字或下劃線 # \W 匹配非字母(包含中文)或數字或下劃線 print(re.findall('\w','太白alex 123 _ *')) # ['太', '白', 'a', 'l', 'e', 'x', '1', '2', '3', '_'] print(re.findall('\w\w','太白alex 123 _ *')) # ['太白', 'al', 'ex', '12'] print(re.findall('\W\w','太白alex 123 _ *')) # [' 1', ' _'] # \s 匹配任意的空白符:(\n和\t屬於空白符) # \S 匹配任意非空白符 print(re.findall('\s','太白 123*\t\n')) # [' ', ' ', '\t', '\n'] print(re.findall('\S','太白 123*\t\n')) # ['太', '白', '1', '2', '3', '*'] print(re.findall('\s\S','太白 123*\t\n')) #[' 1'] # \d 匹配數字 # \D p匹配非數字 print(re.findall('\d', '太白 123*')) # ['1', '2', '3'] print(re.findall('\D', '太白 123*')) # ['太', '白', ' ', ' ', '*'] print(re.findall('\D\d', '太白 123*')) #[' 1'] # \A 從字串開頭匹配 # 只匹配開頭 相當於startswith # ^ 匹配字串的開始 只匹配開頭 相當於startswith print(re.findall(r'\A太白', '** 太白 太白 123*')) # [] print(re.findall(r'^太白', '太白 太白 123*')) # ['太白'] # \n 匹配一個換行符 # \t 匹配一個製表符 print(re.findall('\n','** 太白 太白 \n123')) # ['\n'] print(re.findall('\t','** 太白 太白 \n123\t\t')) # ['\t', '\t'] # $ 匹配一個字串的結尾 print(re.findall('123$','** 太白 太白 123 ')) #[] print(re.findall('123$','** 太白 太白 123')) # ['123'] # 重複匹配: . ? * + {m,n} .* .*? # . 任意字元 re.DOTALL 可以匹配換行符 print(re.findall('a.b', 'ab aab abb a*b a6b a b aaaab')) print(re.findall('a.b', 'ab aab abb a*b a6b a3b a\nb', re.DOTALL)) # ? 匹配0個或者1個由左邊字元定義的片段。 貪婪匹配 print(re.findall('a?b', 'aab')) # ['ab'] print(re.findall('a?b', 'ab aab abb a*b')) # ['ab', 'ab', 'ab', 'b', 'b'] # *匹配0個或者多個左邊字元表示式。 滿足貪婪匹配 @@ print(re.findall('a*b', 'ab aab aaaaaaaaaab abbb')) # + 匹配1個或者多個左邊字元。 滿足貪婪匹配 print(re.findall('a+b', 'ab aab aaab abbb')) # {m,n} 匹配m個至n個左邊字元表示式。 滿足貪婪匹配 @@ print(re.findall('a{2,4}b', 'ab aab aaaab abbb')) # 純貪模式 .* 一般不用 print(re.findall('a.*b', 'ea*b ab aab aaaaaaaaaab abbb')) # ['a*b ab aab aaaaaaaaaab abbb'] # 貪婪模式 .*? .* 純貪 ? 作為限制 滿足我就取出 # .*? 常用模式 print(re.findall('a.*?b', 'a*b ab aab aaaaaaaaaab abbb')) # ['a*b', 'ab', 'aab', 'aaaaaaaaaab', 'ab'] # [] 代表一個字元 # erw 任意選一個 print(re.findall('a[erw][erw]b', 'ab aab aeb arb arwb arewb')) str1 = 'a1b a2b a3b aab aeb a9b' str2 = 'a1b aTb a3b aAb aeb a_b ayb' str3 = 'a1b aTb a3b a-b a%b a!b a&b' print(re.findall('a[0-9]b',str1)) # ['a1b', 'a2b', 'a3b', 'a9b'] print(re.findall('a[a-z]b',str2)) # ['aab', 'aeb', 'ayb'] print(re.findall('a[a-z,A-Z]b', str2)) print(re.findall('a[-!&]b', str3)) # [] 想匹配"-" 一定要放到最前面 print(re.findall('a[^0-9]b', str3)) # "^" 中括號代表取反 # 分組 () 製造了一個模板(.*?)_sb print(re.findall('(.*?)_sb', 'alex_sb wusir_sb 日天_sb')) print(re.findall('http.*?com','<a href="http://www.baidu.com">點選</a><a href="http://www.baidu2.com">登入</a>')) print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">點選</a>')) # | 左邊右邊都可以 # print(re.findall('alex|太白|wusir', 'alex太白wusiraleeeex太太白odlb')) # ['alex', '太白', 'wusir', '太白'] print(re.findall('compan(ies|y)','Too many companies have gone bankrupt, and the next one is my company')) # ['ies', 'y'] # 但是我想將 companies company ?: 對分組進行一個應用,全部都取出來 print(re.findall('compan(?:ies|y)','Too many companies have gone bankrupt, and the next one is my company')) # re模組的操作方法 # findall 找到全部 print(re.findall('a.b', 'abaabb')) # search 相當於 in (注意與group()聯合使用) print(re.search('sb|alex', 'alex sb sb barry 日天')) # <_sre.SRE_Match object; span=(0, 4), match='alex'> print(re.search('aaa', 'alex sb sb barry 日天')) # <_sre.SRE_Match object; span=(0, 4), match='alex'> print(re.search('sb|alex', ' 666 sb alex sb barry 日天').group()) # group相當於輸出可視檔案。 '''1 + 2*(3/5) + 2**3 - (2/3 + 3*(4-2))''' # # match 匹配的就是開始 print(re.match('aaa', 'aaa sb sb barry 日天')) # <_sre.SRE_Match object; span=(0, 3), match='aaa'> print(re.match('aaa', 'aa sb sb barry 日天')) # None print(re.findall('^aaa', 'aa sb sb barry 日天')) # [] # split *** s1 = 'alex wusir 日天 太白' s1 = 'alex wusir,日天;太白|二狗' # print(s1.split()) # # 對字串按照不同分隔符進行分割 # \|是將|進行轉義。 print(re.split(' |,|;|\|',s1)) print(re.sub('barry', '太白', 'barry是最好的講師,barry就是一個普通老師,請不要將barry當男神對待。')) print(re.sub('(alex)( )(is)( )(sb)', r'\5\2\3\4\1', r'alex is sb')) ''' 需求: 1,"1-2*(60+(-40.35/5)-(-4*3))" ''' # 1.1 匹配所有的整數 (pass) s1 = "1-2*(60+(-40.35/5)-(-4*3))" # print(re.findall('\d+', s1)) # ['1', '2', '60', '40', '35', '5', '4', '3'] # 1.2 匹配所有的數字(包含小數) # 0也是整數 print(re.findall('\d+\.?\d*', s1)) # 1.3 匹配所有的數字,包括負號 print(re.findall('-?\d+\.?\d*', s1)) # ['1', '-2', '60', '-40.35', '5', '-4', '3'] # 需求:找到所有的P標籤 s1 = ''' <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/7459977.html" target="_blank">python基礎一</a></p> <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/7562422.html" target="_blank">python基礎二</a></p> <p><a style="text-decoration: underline;" href="https://www.cnblogs.com/jin-xin/articles/9439483.html" target="_blank">Python最詳細,最深入的程式碼塊小資料池剖析</a></p> <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/7738630.html" target="_blank">python集合,深淺copy</a></p> <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/8183203.html" target="_blank">python檔案操作</a></p> <h4 style="background-color: #f08080;">python函式部分</h4> <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/8241942.html" target="_blank">python函式初識</a></p> <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/8259929.html" target="_blank">python函式進階</a></p> <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/8305011.html" target="_blank">python裝飾器</a></p> <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/8423526.html" target="_blank">python迭代器,生成器</a></p> <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/8423937.html" target="_blank">python內建函式,匿名函式</a></p> <p><a style="text-decoration: underline;" href="http://www.cnblogs.com/jin-xin/articles/8743408.html" target="_blank">python遞迴函式</a></p> <p><a style="text-decoration: underline;" href="https://www.cnblogs.com/jin-xin/articles/8743595.html" target="_blank">python二分查詢演算法</a></p> ''' print(re.findall('<p>.*?</p>', s1))
3.sys模組
''' 整體說明: 01 sys模組是與python直譯器互動的一個介面。 02 sys.argv 命令列引數List,第一個元素是程式本身路徑 03 sys.exit(n) 退出程式,正常退出時exit(0),錯誤退出sys.exit(1) 04 sys.version 獲取Python解釋程式的版本資訊 05 sys.path 返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值 06 sys.platform 返回作業系統平臺名稱 ''' import sys # 01 sys常用的模組 print(sys.path) # sys.exit() # 終止程式 print(666) print(sys.version) print(sys.platform) # 返回windows系統名稱 print(sys.modules) # 直譯器自動載入到記憶體的模組和包 sys.exit(0) # 02 sys的異常處理和status try: sys.exit(1) except SystemExit as e: print(e)
4.time模組
''' 整體說明: 01 和時間有關係的我們就要用到時間模組。在使用模組之前,應該首先匯入這個模組。 02 常用方法 (1)time.sleep(secs) :(執行緒)推遲指定的時間執行。單位為秒。 (2)time.time() :獲取當前時間戳 03 表示時間的3種方式:時間戳、元組(struct_time)、格式化的時間字串 (1)方式一:時間戳(timestamp) :通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。 我們執行“type(time.time())”,返回的是float型別。 (2)方式二:格式化的時間字串(Format String): ‘1999-12-06’ (3)方式三:元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等) ''' # 01 匯入時間模組 import time # 02 時間戳 print(time.time()) # 1543240463.5829234 # 03 時間字串 print(time.strftime('%Y-%m-%d')) # 04 時間元祖:localtime將一個時間戳轉換為當前時區的struct_time print(time.localtime()) ''' 執行結果: time.struct_time(tm_year=2018, tm_mon=11, tm_mday=26, tm_hour=21, tm_min=58, tm_sec=27, tm_wday=0, tm_yday=330, tm_isdst=0) '''
5.os模組
''' 整體說明: 01 os模組是與作業系統互動的一個介面。 ''' import os # 複製程式碼#當前執行這個python檔案的工作目錄相關的工作路徑 os.getcwd() #獲取當前工作目錄,即當前python指令碼工作的目錄路徑 os.chdir("dirname") #改變當前指令碼工作目錄;相當於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.sep #輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/" os.linesep #輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n" os.pathsep #輸出用於分割檔案路徑的字串 win下為;,Linux下為: os.name #輸出字串指示當前使用平臺。win->'nt'; Linux->'posix' # 和執行系統命令相關 os.system("bash command") #執行shell命令,直接顯示 os.popen("bash command").read() #執行shell命令,獲取執行結果 # os.environ 獲取系統環境變數 #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的大小