模塊 1. 模塊的分類 模塊,又稱構件,是能夠單獨命名並獨立地完成一定功能的程式語句的集合(即程式代碼和數據結構的集合體)。 (1)自定義模塊 自己定義的一些可以獨立完成某個功能的一段程式語句,可以是一個文件,也可以是一個目錄。 (2)第三方模塊 是由其他人寫的一些程式語句,我們可以用它來實現自己的 ...
模塊
1. 模塊的分類
模塊,又稱構件,是能夠單獨命名並獨立地完成一定功能的程式語句的集合(即程式代碼和數據結構的集合體)。
(1)自定義模塊
自己定義的一些可以獨立完成某個功能的一段程式語句,可以是一個文件,也可以是一個目錄。
(2)第三方模塊
是由其他人寫的一些程式語句,我們可以用它來實現自己的功能。
(3)內置模塊
是由python自己帶的一些實現某種特定功能的組件。
2. 模塊的導入
(1)python預設的模塊尋找路徑
當開始導入一個模快的時候,python預設的會先找到第一個路徑去看一下是否有這個模塊,如果沒有接著再到下一個路徑中去找,知道最後一個路徑。
從這個路徑中我們可以知道,只要我們的模塊在這個路徑中,就可以被導入。
C:\Users\zhou\PycharmProjects\fullstack2\6_19\test C:\python_software\python3.5.2\python35.zip C:\python_software\python3.5.2\DLLs C:\python_software\python3.5.2\lib C:\python_software\python3.5.2 C:\python_software\python3.5.2\lib\site-packagespython預設尋找路徑
(2)自定義模塊的導入
<1>. 自定義模塊在python的預設路徑中
第一種方式,導入文件,然後文件去調用函數
下圖左邊的為目錄樹,lib,index和module1在同一目錄下,module2,module3在lib目錄下,右邊的為index文件導入模塊的方法。
到操作某個文件的時候, 預設的就會把此文件的路徑加入預設路徑中。
* module1可以直接導入,因為與index在同一文件夾下
* module2和module3要通過以下方式進行導入,因為他們不在一個目錄中,要首先找到與index同級的目錄才可以
第二種方式,導入函數
直接調用函數
lib.module2:預設調用函數時,目錄之間用點去分割
<2>. 自定義模塊不在python的預設路徑中
我們需要把自定義模塊的路徑加入到python預設的路徑中,然後就可以像上面的的方法一樣進行調用了。
# sys模塊在後面會有說明,此處的append是把D:路徑加入 # 然後D盤的所有模塊就可以導入了 import sys sys.path.append('D:') for i in sys.path: print(i)
(3)內置模塊和第三方模塊的導入
內置模塊的和第三方模塊的導入很簡單,直接用import 模塊名稱 就可以了,因為內置模塊和自定義模塊的的路徑其實就是在python的預設尋找路徑中,所以可以直接用import導入。
第三方模塊的安裝:
<1>. 安裝管理工具
pip install requests
<2>. 下載源碼安裝
一. os
1. os模塊的作用
os(operating system)操作系統的意思,所以,從名字就可以看出來,此模塊主要是和系統級別相關的一些功能。
2. os模塊的方法
1 os.join(路徑1, 路徑2) 把這兩個路徑合成一個路徑 2 # 例題: 3 a = os.path.join('zhou\\PycharmProjects\\fullstack2\\6_1\\6_10','test1.py') 4 print(a) 5 # 結果: 6 zhou\PycharmProjects\fullstack2\6_1\6_10\test1.py 7 8 os.state(路徑): 顯示當前路徑的一些狀態信息 如: 大小,uid,gid,修改時間,創建時間 9 os.getcwd(): 不需要參數,就是顯示出當前文件所在目錄 10 os.mkdir(路徑, 許可權) windows下創建目錄,註意是雙斜杠 11 12 os.rmdir() windows下刪除目錄, 如果目錄不為空,則不能刪除 13 # 例題: 14 os.mkdir('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1', 640) 15 os.rmdir('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1') 16 17 os.makedir() 遞歸創建目錄 18 os.removedir() 遞歸刪除目錄 19 # 例題: 6_1目錄不存在,遞歸創建,然後remove遞歸刪除 20 os.makedirs('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10', 640) 21 os.removedirs('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 22 23 os.listdir(路徑): 列出當前目錄下的所有內容,相當於list 24 os.chdir(路徑) 改變當前路徑,相當於cd 25 # 例題: 26 os.chdir('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 27 print(os.getcwd()) 28 29 os.curdir 返回到當前路徑 30 os.pardir 返回到父目錄 31 # 例題: 32 print(os.curdir)----> . 33 print(os.pardir)----> .. 34 35 os.rename(舊文件的名字,新文件的名字) 重命名 36 # 例題: 37 os.rename('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10\\test1','C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10\\test1.py') 38 39 os.name 當前操作系統的名稱 windows下為"nt", linux下為"posix" 40 os.pathsep 用來分割路徑的操作符 ";" 41 os.linesep 操作系統的換行符,windows下為"\t\n", linux下為"\n" 42 os.sep 操作系統特定的路徑分隔符,windows下為"\", linux下為"/" 43 os.environ 當前操作系統的環境變數 44 # 例題: 45 print(os.sep) 46 print(os.linesep) 在win下顯示為兩行空格(此處感覺有點奇怪,按理說應該是一行才對) 47 print(os.pathsep) 48 print(os.name) 49 print(os.environ) 50 51 os.basename() 得到路徑的基名 52 os.dirname() 得到路徑的父目錄 53 os.path.exists() 判斷路徑是否存在 54 os.path.split() 把路徑的基名和父目錄分割開來 55 os.path.abspath() 得到他的絕對路徑 56 os.path.isabs() 判斷是不是絕對路徑,如果是返回True,如果不是返回Flase 57 # 例題: 58 a = os.path.dirname('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 59 b = os.path.basename('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 60 c = os.path.exists('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 61 d = os.path.split('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 62 e = os.path.abspath("test.py") 63 64 print(a) 65 print(b) 66 print(c) 67 print(d) 68 print(e) 69 # 結果: 70 C:\Users\zhou\PycharmProjects\fullstack2\6_1 71 6_10 72 True 73 ('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1', '6_10') 74 C:\Users\zhou\PycharmProjects\fullstack2\6_19\test.py 75 76 os.path.isfile() 判斷路徑是不是一個文件 77 os.path.isdir() 判斷路徑是不是一個目錄 78 os.path.getatime() 最後存取時間 79 os.path.getctime() 最後創建時間 80 os.path.getmtime() 最後修改時間 81 # 例題: 82 f = os.path.isfile('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 83 g = os.path.isdir('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 84 h = os.path.getatime('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 85 i = os.path.getctime('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 86 j = os.path.getmtime('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10') 87 print(f) 88 print(g) 89 print(h) 90 print(i) 91 print(j) 92 # 結果: 93 False 94 True 95 1497872812.4467745 96 1497864841.8512993 97 1497872812.4467745os的模塊使用方法和事例
二. sys
1. sys模塊的作用
sys(system)系統的意思,這個模塊可供訪問由解釋器使用或維護的變數和與解釋器進行交互的函數。
2. sys模塊的使用方法
sys.argv 傳入文件的參數 sys.path 預設的模塊查詢目錄 sys.version Python的版本 sys.exit() 退出程式 sys.platform 使用的平臺----->win32 sys.stdout.write() 列印不換行
三. json
1. json模塊的作用
當我們從網上的到一個網頁的時候,一般會得到三種數據(從網站上得到的數據最終都是字元串)
<1>. html html我們都知道是一種標記語言,具有固定的格式。
<2>. json json不是一種語言,但是它具有固定的格式,就是類似字典,元組,列表的格式的字元串,我們可以功過json讓其進行相互轉換
<3>. xml xml是另一種語言,類似於html,也具備固定的格式,有tag,attitude,text等。可以通過xml進行解析
2. json模塊的使用方法
1 json.loads() 將字元串格式的字典和元組轉換成對應的字典或者元組 2 # 例題: 3 import json 4 s1 = '''{ 5 "name":"hu", 6 "age":1, 7 "gender":"man" 8 }''' 9 a = json.loads(s1) 10 print(a, type(a)) 11 # 結果: 12 {'name': 'hu', 'age': 1, 'gender': 'man'} <class 'dict'> 13 # 註意s1中不能出現單引號 14 15 json.dumps() 將字典或者列表轉換成字元串 16 17 # 例題: 18 import json 19 s2 = {'age': 1, 'gender': 'man', 'name': 'hu'} 20 a = json.dumps(s2) 21 print(a, type(a)) 22 # 結果: 23 {"gender": "man", "age": 1, "name": "hu"} <class 'str'> 24 25 26 json.dump() 寫入中文會是亂碼,暫時沒有找到轉換字元的地方 27 # 例題: 28 s2 = { 29 "name":'zhou', 30 "age":12, 31 "gender":"woman" 32 } 33 import json 34 json.dump(s2, open('test1', 'a', encoding='utf-8')) 35 # 結果: 追加到test1的內容 36 { 37 "name":"hu", 38 "age":1, 39 "gender":"man" 40 }{"age": 12, "name": "zhou", "gender": "woman"} 41 42 43 44 json.load() 將文件中的字元串轉換成字典類型 45 # 例題: test1 文件中的內容就是下麵的字典 46 import json 47 a = json.load(open('test1', 'r', encoding='utf-8')) 48 print(a, type(a)) 49 # 結果: 50 {'name': 'hu', 'gender': 'man', 'age': 1} <class 'dict'>
四. re
1. re模塊的作用
re是正則表達式,主要用來對字元串的匹配
2. re模塊的使用方法
re.match 只在開頭進行匹配
re.search 只匹配第一次匹配到的
re.findall 匹配所有匹配到的
# 由結果我們可知, # 因為開頭沒有hu,所以a的返回值為None # 因為search只會匹配第一個,所以只顯示了一次hu # 因為findall會匹配所有的,所以顯示了兩次 import re s1 = "hello, hu, hhh, hu" a = re.match("hu", s1) b = re.search("hu", s1).group() c = re.findall("hu", s1) print(a) print(b) print(c) 結果: None hu ['hu', 'hu']三種方法的解析
分組的概念,如果沒有分組,預設的groups和groupdict都是空
group 預設所有的都會放入group中
groups 只有分組的才會放在groups
groupdict 只有是字典的才會放在groupdict
# ?P<名稱>是字典的寫入形式 # 從結果我們可以看出來,groups放的是他的組的信息,和字典沒有關係 # 而groupdict放的是字典,和groups也沒有關係 import re s1 = "huello, hu, hhh, hu" a1 = re.match("(?P<name>h)(u)", s1).group() a2 = re.match("(?P<name>h)(u)", s1).groups() a3 = re.match("(?P<name>h)(u)", s1).groupdict() print(a1) print(a2) print(a3) 結果: hu ('h', 'u') {'name': 'h'}match方法
# 因為他找的只是第一個,所以和match沒有太大的區別, # 他們的結果也是一樣的 import re s1 = "huello, hu, hhh, hu" a1 = re.search("(?P<name>h)(u)", s1).group() a2 = re.search("(?P<name>h)(u)", s1).groups() a3 = re.search("(?P<name>h)(u)", s1).groupdict() print(a1) print(a2) print(a3)search方法
# findall這個方法本深並沒有什麼分組不分組的,只是如果有小括弧,他只會顯示小括弧裡面的內容,並把他們組合成列表 import re s1 = "huello, hu, hhh, hu" a1 = re.findall("(h)(u)", s1) print(a1) 結果: [('h', 'u'), ('h', 'u'), ('h', 'u')]findall方法
import re s1 = "huello, hu, hhh, hu" # 只要遇到“hu”字元串,就會進行切分,並且刪除此字元串 a1 = re.split('hu', s1) # 遇到第一個“hu”字元串,進行切分,並且刪除此字元串,把字元串分割成兩塊 a2 = re.split('hu', s1, 1) ## 遇到第一個“hu”字元串,進行切分,不會刪除此字元串,把字元串分割成三塊 a3 = re.split('(hu)', s1, 1) print(a1) print(a2) print(a3) 結果: ['', 'ello, ', ', hhh, ', ''] ['', 'ello, hu, hhh, hu'] ['', 'hu', 'ello, hu, hhh, hu']split方法
五. random
1. random模塊的作用
random就是為了生成一個隨機數
2. random的應用
<1>. 驗證碼的生成
1 # 導入random模塊 2 # 調用random.randrange()模塊生成一個隨機數 3 # 拼接字元串 4 5 import random 6 yanzhengma = str() 7 for i in range(6): 8 ran = random.randrange(0, 4) 9 if ran == 0 or ran == 2: 10 yanzhengma += chr(random.randrange(65, 91)) 11 else: 12 yanzhengma += str(random.randrange(0, 10)) 13 print(yanzhengma)
六. hashlib
1. hashlib模塊的作用
hashlib主要用來給字元串進行加密。加密的方法有md5, sha1,sha224, sha256,sha384,sha512
md5演算法是不能反解的
2. hashlib模塊的應用
<1>. md5的應用
加鹽是什麼呢?
雖然說md5加密不能反解,但是它只要是同一個密碼,用md5生成之後還是一樣的,因此,這樣的密碼還是不安全的,因此我們需要在原來的密碼基礎上在加上一段只有自己知道的字元,然後生成密碼,這樣就算是破解了也不會知道自己的密碼(這就是我們所說的加鹽)
1 import hashlib 2 # 創建對象 加鹽 3 hash = hashlib.md5(bytes('lljeg', encoding='utf-8')) 4 # 生成密碼 5 hash.update(bytes('hu', encoding='utf-8')) 6 # 顯示密碼 7 print(hash.hexdigest()) 8 9 #18bd9197cb1d833bc352f47535c00320 10 #498e327141378fa4d31e5b4c6543db22
七. getpass
1. getpass 模塊的作用
getpass主要用來在輸入密碼的時候不顯示,防止密碼泄露的。
2. getpass的應用
<1>. getpass密碼隱藏輸入
# 導入getpass模塊,然後使用getpass方法,就可以使密碼隱藏輸入 # 註意的是有時候getpass模塊在pycharm是沒有辦法使用的,只能在終端使用 >>> import getpass >>> a = getpass.getpass("Password: ") Password: >>> print(a) legj >>>
八. zipfile
1. zipfile模塊的作用
zipfile主要用於對文件的壓縮和解壓。
2. zipfile模塊的使用
<1>. 解壓
# 解壓 import zipfile zi = zipfile.ZipFile('聯繫.zip', 'r') # 顯示壓縮包中的文件名稱 # print(zi.namelist()) # 解壓全部 zi.extractall() # 解壓某個文件夾 # zi.extract('openssl.txt')
zi.close()
<2>. 壓縮
import zipfile # 創建一個壓縮包,以追加的方式寫入壓縮包 zi = zipfile.ZipFile('我的壓縮包.zip', 'a') # 壓縮一個文件到壓縮包中 zi.write('config') zi.write('log') # 關閉壓縮文件 zi.close()
九. subporcess
1. subprocess模塊的作用
subprocess專門用於python執行系統命令
2. subprocess模塊的使用方法
1 # 簡單命令 2 call() 輸入是windows終端命令,當命令執行成功,返回1,結果直接列印在終端上(暫時不太清楚和check_all的區別) 3 check_call() 輸入的是windows終端命令,當命令執行成功,返回1,否則返回0 4 check_output() 輸入的是windows終端命令,會把結果返回給一個變數 5 # 例題: 6 a = subprocess.call('ipconfig', shell=True) 7 b = subprocess.check_call('ipconfig') 8 c = subprocess.check_output('ipconfig') 9 print(a, b, c) 10 # 結果: 11 只有c會有返回值,a和b都是0 12 #複雜命令 13 subprocess.Popen 創建一個可執行複雜命令的對象 14 subprocess.PIPE 開闢標準輸入輸出的管道 15 # 例題: 16 cmd = subprocess.Popen("python", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) 17 18 cmd.stdin.write('print(1)\n') 19 cmd.stdin.write('print(2)') 20 cmd.stdin.close() 21 22 a = cmd.communicate() 23 print(a, type(a)) 24 25 # 結果: 26 ('1\n2\n', '') <class 'tuple'>
十. logging
1. logging模塊的作用
logging模塊主要用來規範寫入日誌的格式和寫入日誌的時間,防止多線程同時修改日誌,從而導致日誌不安全。
2. logging的使用方法
# 日誌級別 CRITICAL = 50 FATAL = CRITICAL ERROR = 40 WARNING = 30 WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0 寫入同一個日誌文件中 logging.basicConfig # 例子: import logging logging.basicConfig( filename='logging', format = '%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=logging.INFO ) logging.error('sss') # 結果: 2017-06-19 22:18:41 PM - root - ERROR - <encoding error>: 1111 寫入不同的日誌文件中 logging.FileHandler 定義日誌文件 logging.Formatter 定義日誌文件的格式 logging.Logger 定義日誌文件的級別 log.addHandler 添加日誌文件 log.critical 寫入日誌文件 # 例子2: import logging # 定義格式 file_1 = logging.FileHandler('log1', 'a') fmt1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s') file_1.setFormatter(fmt1) file_2 = logging.FileHandler('log2', 'a') fmt2 = logging.Formatter() file_2.setFormatter(fmt2) #定義級別 log = logging.Logger('lsl', logging.INFO) log.addHandler(file_1) log.addHandler(file_2) log.critical('kjjjj')
十一. xml
1. xml模塊的作用
由上面的介紹可知,我們去訪問一下網站的時候,一般會返回給我們是三種數據,一個就是html,一個是json,一個就是xml,其實xml本身是一門語言,他具有特定的格式,比如tag(標簽),attribute(屬性),text(內容),基本上也就是這樣的格式。下麵的就是這樣的一種xml語言
#<>中間的第一個單詞被稱為tag,tag後面的都是屬性 # 沒有被<>包裹的就是text