一 模塊
模塊:就是一組功能的集合體, 我們的程序可以直接導入模塊來復用模塊里的功能
導入方式 一般為 : import 模塊名
在python中, 模塊一般分為四個通用類別
1使用python編寫.py 文件 2、已被編譯為共享庫或DLL 的c 或c++擴展 3把一系列模塊組織到一起的文件夾(注:文件夾下有一個__init__.py文件,該文件夾稱之為包) 4、使用c編寫並鏈接到python解釋器的內置模塊
使用模塊的優點:
1、從文件級別組織程序, 更方便管理
2、拿來主義, 提升開發效率
二 使用模塊 import
導入模塊 import
1:語法: import 模塊名
2:在第一次導入模塊時會做三件事,重復導入會直接引用內存中已經加載好的結果
1、為源文件穿件新的名稱空間, 2、在新建的名稱空間中執行模塊中包含的代碼。 3、創建名字(模塊名)來引用該名稱空間
3:被導入的模塊 有獨立的名稱空間
每個模塊都是一個獨立的名稱空間, 定義在這個模塊中的函數,把這個模塊的名稱空間當做全局名稱空間, 這樣我們在編寫自己的模塊時, 就不用擔心我們定義在自己模塊中全局變量會被導入時 , 與使用者的全局變量沖突。
4 為模塊名起別名
為依據導入的模塊起別人的方式對編寫可擴展的代碼很有用
import span as sm
5 在一行中導入多個模塊 模塊名中間用 “,” 分隔
import sys,os,re
三 使用模塊 form.....import
1、from...import 的使用
1 from 模塊名 import 要讀的read1,read2
2 、import 和from ....import 的對比
唯一區別就是:使用from。。import... 則是將spam 中的名字直接導入到當前的名稱空間中, 所有在當前名稱空間中, 直接使用名字就可以了, 無需加前綴 模塊名
優點:使用起來方便了
缺點:容易與當前執行文件中的名字沖突
3、也支持重命名 as
from spam import read1 as read
4、一行導入多個名字
from spam import read1,read2,money
5、 導入所有 from。。。。import *
#from spam import * 把spam中所有的不是以下划線(_)開頭的名字都導入到當前位置
四:py 文件區分兩種用途:模塊與腳本
編寫好的一個python文件 可以有兩種途徑: 一:腳本,一個文件就是整個程序,用來被執行 二 :模塊,文件中存放着一堆功能,用來唄導入使用 #python為我們內置了全局變量__name__, 當文件被當做腳本執行時:__name__ 等於'__main__' 當文件被當做模塊導入時:__name__等於模塊名 #作用:用來控制.py文件在不同的應用場景下執行不同的邏輯 if __name__ == '__main__':
五:模塊的搜索路徑
模塊的查找順序:內存中已經加載的模塊-->內置模塊---->sys.path路徑中包含的模塊
包
包就是一個包含有__init__.py文件的文件夾,所以其實我們創建包的目的就是為了用文件夾將文件/模塊組織起來
需要強調的是:
1、在python3中,即使包下沒有__init__.py 文件,import包仍然不會報錯,而python2中若是沒有的話, 就會報錯
2、創建包的目的不是為了運行, 而是被導入使用, 記住,包只是模塊的一種形式而已,包的本質就是一種模塊
一、包的使用之import
1 import glance.db.models 2 glance.db.models.register_models('mysql')
二:包的使用之 from。。。import。。。
1 from glance.db import models
強調:
1、在導入時帶點, 點的左邊必須是一個包, 這是導入包特有的語法 2、包內, 模塊直接的導入應該使用from。。。import。。。 3、from。。。import。。。。 import后必須是一個明確的名字, 沒有任何的前綴。 from a.b.c.f import g.h.x # 這是錯誤的 #f 的左邊必須是包 import后的名字不能有任何的前綴, 不能有 .
常用模塊
一、time和datetime 模塊
在python中通常有這幾種方式來表達時間:
1:時間戳(timestamp):通常來說, 時間戳表示的是從1970年1月1日 00:00:00 開始按照秒計算的偏移量
2:格式化的時間字符串(Format String)
3:結構化的時間(struct_time):struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天,夏令時)
二、random模塊
1 import random 2 3 print(random.random())#(0,1)----float 大於0且小於1之間的小數 4 5 print(random.randint(1,3)) #[1,3] 大於等於1且小於等於3之間的整數 6 7 print(random.randrange(1,3)) #[1,3) 大於等於1且小於3之間的整數 8 9 print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5] 10 11 print(random.sample([1,'23',[4,5]],2))#列表元素任意2個組合 12 13 print(random.uniform(1,3))#大於1小於3的小數,如1.927109612082716 14 15 16 item=[1,3,5,7,9] 17 random.shuffle(item) #打亂item的順序,相當於"洗牌" 18 print(item)
三: os 模塊
os 模塊是與操作系統交互的一個接口

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.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最后的文件名。如何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路徑處理:
推薦使用:
import os
import os,sys possible_topdir = os.path.normpath(os.path.join( os.path.abspath(__file__), os.pardir, #上一級 os.pardir, os.pardir )) sys.path.insert(0,possible_topdir)
四: sys模塊
1 sys.argv 命令行參數List,第一個元素是程序本身路徑 2 sys.exit(n) 退出程序,正常退出時exit(0) 3 sys.version 獲取Python解釋程序的版本信息 4 sys.maxint 最大的Int值 5 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 6 sys.platform 返回操作系統平台名稱
五 序列化:json&pickle
序列化:我們把對象(變量)從內存中編程可存儲或傳輸的過程稱之為序列化,在python中pickling.
序列化的優點:
1:持久保存狀態
2:跨平台數據交互 (其中pickle只能讀取python文件,不能跨平台)
import json
import pickle
注意:json 不認單引號,
序列化:
序列化:
json。dumps(dic)
pickle.dumps(s)
反序列化:
json.loads()
pickle.loads()
六 hashlib 模塊
1:hash:一種算法, 該算法接受傳入的內容,經過運算得到一串 hash值
hash 值得特點是:
#只要傳入的內容是一樣的 得到的hash值必然一樣。
#不能由hash值返解成內容 ===》把密碼做成hash值,不應該在網絡傳輸明文密碼
#只要使用的hash算法不變, 無論小燕的內容多大, 得到的hash值長度是固定的
# import hashlib # # m=hashlib.md5() # m.update('hello'.encode('utf-8')) # m.update('world'.encode('utf-8')) # m.update('egon'.encode('utf-8')) # print(m.hexdigest()) #3801fab9b8c8d9fcb481017969843ed5
密碼加鹽
import hashlib pwd="alex12345" m=hashlib.me5() m.update("一行白鷺上青天") m.update(pwd.encode("utf-8")) print(m.hexdigest())
七 re模塊(正則)
正則就是用一些具有特殊含義的符號組合到一起(正則表達式)來描述字符或者字符串的方法。或者說正則就是 用來描述一列事物的規則。
在(python 它內嵌在python中, 並通過re模塊來實現。
二 常用匹配模式(元字符)

=================================匹配模式================================= #一對一的匹配 # 'hello'.replace(old,new) # 'hello'.find('pattern') #正則匹配 import re #\w與\W print(re.findall('\w','hello egon 123')) #['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3'] print(re.findall('\W','hello egon 123')) #[' ', ' '] #\s與\S print(re.findall('\s','hello egon 123')) #[' ', ' ', ' ', ' '] print(re.findall('\S','hello egon 123')) #['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3'] #\n \t都是空,都可以被\s匹配 print(re.findall('\s','hello \n egon \t 123')) #[' ', '\n', ' ', ' ', '\t', ' '] #\n與\t print(re.findall(r'\n','hello egon \n123')) #['\n'] print(re.findall(r'\t','hello egon\t123')) #['\n'] #\d與\D print(re.findall('\d','hello egon 123')) #['1', '2', '3'] print(re.findall('\D','hello egon 123')) #['h', 'e', 'l', 'l', 'o', ' ', 'e', 'g', 'o', 'n', ' '] #\A與\Z print(re.findall('\Ahe','hello egon 123')) #['he'],\A==>^ print(re.findall('123\Z','hello egon 123')) #['he'],\Z==>$ #^與$ print(re.findall('^h','hello egon 123')) #['h'] print(re.findall('3$','hello egon 123')) #['3'] # 重復匹配:| . | * | ? | .* | .*? | + | {n,m} | #. print(re.findall('a.b','a1b')) #['a1b'] print(re.findall('a.b','a1b a*b a b aaab')) #['a1b', 'a*b', 'a b', 'aab'] print(re.findall('a.b','a\nb')) #[] print(re.findall('a.b','a\nb',re.S)) #['a\nb'] print(re.findall('a.b','a\nb',re.DOTALL)) #['a\nb']同上一條意思一樣 #* print(re.findall('ab*','bbbbbbb')) #[] print(re.findall('ab*','a')) #['a'] print(re.findall('ab*','abbbb')) #['abbbb'] #? print(re.findall('ab?','a')) #['a'] print(re.findall('ab?','abbb')) #['ab'] #匹配所有包含小數在內的數字 print(re.findall('\d+\.?\d*',"asdfasdf123as1.13dfa12adsf1asdf3")) #['123', '1.13', '12', '1', '3'] #.*默認為貪婪匹配 print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b'] #.*?為非貪婪匹配:推薦使用 print(re.findall('a.*?b','a1b22222222b')) #['a1b'] #+ print(re.findall('ab+','a')) #[] print(re.findall('ab+','abbb')) #['abbb'] #{n,m} print(re.findall('ab{2}','abbb')) #['abb'] print(re.findall('ab{2,4}','abbb')) #['abb'] print(re.findall('ab{1,}','abbb')) #'ab{1,}' ===> 'ab+' print(re.findall('ab{0,}','abbb')) #'ab{0,}' ===> 'ab*' #[] print(re.findall('a[1*-]b','a1b a*b a-b')) #[]內的都為普通字符了,且如果-沒有被轉意的話,應該放到[]的開頭或結尾 print(re.findall('a[^1*-]b','a1b a*b a-b a=b')) #[]內的^代表的意思是取反,所以結果為['a=b'] print(re.findall('a[0-9]b','a1b a*b a-b a=b')) #[]內的^代表的意思是取反,所以結果為['a=b'] print(re.findall('a[a-z]b','a1b a*b a-b a=b aeb')) #[]內的^代表的意思是取反,所以結果為['a=b'] print(re.findall('a[a-zA-Z]b','a1b a*b a-b a=b aeb aEb')) #[]內的^代表的意思是取反,所以結果為['a=b'] #\# print(re.findall('a\\c','a\c')) #對於正則來說a\\c確實可以匹配到a\c,但是在python解釋器讀取a\\c時,會發生轉義,然后交給re去執行,所以拋出異常 print(re.findall(r'a\\c','a\c')) #r代表告訴解釋器使用rawstring,即原生字符串,把我們正則內的所有符號都當普通字符處理,不要轉義 print(re.findall('a\\\\c','a\c')) #同上面的意思一樣,和上面的結果一樣都是['a\\c'] #():分組 print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab'] print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab print(re.findall('(?:ab)+123','ababab123')) #findall的結果不是匹配的全部內容,而是組內的內容,?:可以讓結果為匹配的全部內容 print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">點擊</a>'))#['http://www.baidu.com'] print(re.findall('href="(?:.*?)"','<a href="http://www.baidu.com">點擊</a>'))#['href="http://www.baidu.com"'] #| print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))