常用模塊
什么是模塊 ?
在計算機程式的開發程序中,隨著程式代碼越寫越多,在一個檔案里代碼會越來越長,越來越不容易維護,
為了撰寫可維護的代碼,我們把很多的函式分組,分別放到不同的檔案里,這樣每個檔案包含的代碼就相對較少了,很多編程語言都采用了這種組織代碼的方式,在Python中,一個.py檔案就可以稱之為一個模塊 module
模塊分為三種:
內置標準模塊(又稱標準庫),執行help(‘modules‘) 查看所有Python自帶模塊串列
第三方開源模塊,可通過pip install 模塊名 聯網安裝
自定義模塊,自己寫的模塊
模塊 匯入&呼叫
Import module # 匯入 import os ,sys print(os.path) from os import path #直接匯入path模塊,直接使用path,無需os.path print(path) from asyncio.events import get_event_loop as get_events #as想當于重命名 print(get_events())模塊匯入
自定義模塊
Module_custom.py name = 'alex' print('hello',name) def sayhi(n): print('hi',n) Module_importcustom.py import Modules.Module_custom as name name.sayhi('jack')DIY模塊
安裝第三方模塊
開源的Python鏡像網站
pypi.org
pypi.douban.com/simple 豆瓣的使用方法 pip install -i http://pypi.douban.com/simple/ paramiko
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('10.3.10.241',22,'deepin','deepin1') stdin,stdout,stderr = ssh.exec_command('ip add') print(stdout.read().decode('utf-8')) ssh.close()paramiko
Sys、os模塊的使用
# -*- coding:utf-8 -*- import os print(__file__) # 列印一個當前腳本的路徑 print(os.getcwd()) # 獲取當前腳本的目錄pwd print(os.listdir("/tmp")) #、獲取/tmp目錄下的檔案 os.path.isfile('/tmp/abc') # 判斷/tmp/abc 是否是一個檔案 os.path.isdir('/tmp') # 判斷/tmp 是否是一個目錄 os.path.isabs('~/ccn') #判斷一個檔案是不是絕對路徑 os.path.split("/tmp/abc") # 提取出目錄名,檔案名 分開顯示 os.path.dirname("/tmp/abc") # 只獲取目錄名 ,不獲取檔案名 os.path.abspath("~/ccn") #獲取絕對路徑 os.stat("/tmp") # 獲取/tmp檔案屬性 相當于 linux下的stat os.chmod('/tmp') #修改/tmp權限 相當于linux下chmod功能一樣 os.kill(123,9) #殺死相關行程 前邊是行程號 后邊是kill的信號 相當于linux下的kill -9OS模塊的常用方法
import sys sys.argv # 命令列引數list ,第一個元素是程式本身路徑 sys.exit(0) # 退出程式 ,正常退出時exit(0) sys.version # 獲取Python解釋程式的版本資訊 sys.maxint # 最大的int值 sys.path #回傳模塊Module的搜索路徑 sys.platform #回傳作業系統平臺的名稱 sys.getrecursionlimit() # 獲取最大遞回層數 default 100 sys.setrecursionlimit(1500) #設定最大遞回層數 1500 sys.getdefaultencoding() #獲取解釋器 使用的默認編碼 utf8 sys.getfilesystemencoding() # 獲取資料存盤到檔案里的默認編碼 utf8sys模塊常用方法
時間模塊
時間處理歸為三種:
時間的顯示 , 在螢屏顯示、記錄日志等
時間的轉換 , 比如把字串格式的日期轉換成Python中的日期型別
時間的運算,計算兩個日期間的差值等
time模塊
1.時間戳 ,表示的1970年1月1日0.0.0分
2.格式化的時間字串,比如’2020-10.03 10:00’
3.元祖共九個元素,由于Python的time模塊實作主要呼叫的c庫,平臺上不一樣
UTF 時間
UTF世界標準時間, 中國為UTF+8,又稱東8區
time模塊的方法(以上都可以傳時間秒數的引數,如果不傳默認使用的是系統的時間戳)
Time.localtime() # 將秒數轉化成 年的方法- 正常顯示的時間
Time.getime() # 將時間轉換成世界時間
Time.mktime() # 將時間時間轉化成時間戳(秒數)
Time.sleep() # 延時五分鐘
time.asctime() #把一個表示時間的元祖或者世界時間表示為這種形式:Fri Mar 27 22:46:17 2020
Time.ctime() #把一個時間戳轉換成time.asctime()的形式
Time.strftime() # 將時間轉換成你想要的字串格式 print(time.strftime("%Y-%m-%d",time.localtime()))
Time.strptime() #將字串格式轉換成日期print(time.strptime("2020.1.2 10:10","%Y.%m.%d %H:%M"))
Datetime 模塊
Datetime模塊定義了下面的這幾類:
Datetime.data 表示日期的一個類
datetime.date.today()
datetime.date(2020, 3, 27)
datetime.date.fromtimestamp(1222222222) #將時間戳轉換成時間
datetime.date(2008, 9, 24)
Datetime.time 表示時間的類
Datetime.datetime 表示日期時間的型別
datetime.datetime.now()
datetime.datetime(2020, 3, 27, 23, 5, 37, 909430)
datetime.datetime.fromtimestamp(123455)
datetime.datetime(1970, 1, 2, 18, 17, 35)
t1 = datetime.datetime.now()
t1 - datetime.timedelta(days=3)
datetime.datetime(2020, 3, 24, 23, 8, 55, 386942)
datetime.datetime.now().replace(year=20,month=10,day=5,minute=1,hour=1)
datetime.datetime(20, 10, 5, 1, 1, 31, 412669)
Pytz模塊
Pytz.alltimezones 查看所有時區
Datetime.datetime.now(tz = pytz.timezone(“Africa/Abidjan”))
Random亂數模塊
# -*- coding:utf-8 -*- import random import string print(random.randrange(1,10)) # 回傳1-10之間的一個亂數,不包括10 print(random.randint(1,10)) # 回傳1-10之間的一個亂數,包括10 print(random.random()) # 回傳一個隨機浮點數,小數 print(random.choice('qwrrqtyeywy')) #回傳給定字串中的隨機一個字符 print(random.sample('3143445sfwrqrt',4)) #回傳給定字串中,4個隨機字符,以串列形式顯示 print("".join(random.sample(string.digits+string.ascii_lowercase+string.ascii_uppercase,4))) # 生成隨機4位驗證碼 a = list(string.digits+string.ascii_lowercase+string.ascii_uppercase) #洗牌將數字\大小寫英文 使用shuffle打亂順序 random.shuffle(a) print(a)Random 模塊
序列化pickle & json模塊
Pickle ----pickle 可以多次dump 多次load 但建議只一次
# -*- coding:utf-8 -*- import pickle d = { "name":"alex", "role":"police", "blood":"76", "weapon":"AK47" } arrive_players = ["alex","jack","rain" ] # d_dump = pickle.dumps(d) # dumps叫做序列化,將不同的資料型別,轉換成bytes格式,存入硬碟 # print(d_dump) # # print(pickle.loads(d_dump)) #loads叫做反序列化,將bytes位元組型別轉換成相應的資料型別 # f = open("game.pkl","wb") #存入的是16進制數,所以用wb格式 pickle.dump(d,f) # pickle.dump 方法直接可以序列化的存入檔案內 pickle.dump(arrive_players,f) f = open("game.pkl","rb") # 因為存入的是進制數,所以取也要用rb模式取 print(pickle.load(f)) # pickle.load將序列化的資料讀取出來,序列化了幾次就要取幾次 print(pickle.load(f))
# dump是寫入檔案,dumps是在記憶體中生成序列化的字串
# load從檔案加載,反序列化, loads把序列化的字串反向決議 建議只dump一次,否則程式多會亂
Json ------json 一個檔案只能一次dump ,一次load
import json d = { "name":"alex", "role":"police", "blood":"76", "weapon":"AK47" } arrive_players = ["alex","jack","rain" ] #print(json.dumps(d)) f = open("game.json",'w') json.dump(d,f) #json.dump(arrive_players,f) f = open("game.json",'r') print(json.load(f))
Pickle 和 json的區別
Pickle只支持python,支持所有的資料型別 時間都可以
json 支持所有變成語言 .只支持常規的資料型別str . int .dict.set . list .tuple
Hashlib加密模塊
Md5功能
輸入任意長度的資訊,經過處理,輸出為128位的資訊(數字指紋):
不同的輸入得到的不同的結果(唯一性)
Md5演算法的特點
1. 壓縮性:任意長度的資料,算出的md5值的長度都是固定的.
2. 容易計算:從元資料計算出md5值很容易
3. 抗修改性:對源資料進行任何改動,修改一個位元組生成的md5值區別也很大
4. 強抗碰撞: 已知原資料和md5,想找到一個具有相同md5值的資料(即偽造資料)是非常困難的.
Md5演算法是否可逆
Md5不可逆的原因是一種散列函式,使用的hash演算法,在計算程序中原文的部分資訊是丟失了的.
Md5的用途
1. 防止被篡改
2. 防止直接看到明文
3. 防止抵賴(數字簽名)
import hashlib
m = hashlib.md5()
m.update(b"hello alex")
print(m.hexdigest())
m.update("房糾紛解決".encode("utf8"))
#print(m.digest())
print(m.hexdigest())
Hashlib -- sha加密演算法
s1 = hashlib.sha1()
s1.update('發發發'.encode("utf-8"))
s1.hexdigest()
'22b90f88377478e852388db42b707488ed8cf3c9'
s2 = hashlib.sha3_256()
s2.update("嘻嘻".encode("utf-8"))
s2.hexdigest()
'd3b4813643938fb3cf57b775c947dd638b59f60bcc9258ed400b6e0fbbf5a925'
檔案copy模塊shutil
import shutil shutil.copyfileobj(open("game.json"),open("game2.json",'w')) shutil.copyfile("game.json","game3.json") shutil.copymode() #僅copy權限,內容\組\用戶均不變 不會copy內容,目標檔案必須存在 shutil.copystat() #僅copy狀態的資訊 mtime ctime atime,不會copy內容,目標檔案必須存在 shutil.copy() #copy權限和內容 shutil.copy2() # copy權限和狀態的資訊 shutil.copytree() #copy整個目錄 shutil.copytree("../Modules","Modules_cpoy",ignore=shutil.ignore_patterns("*.py","*.pkl")) # ignore排除相應檔案進行copy shutil.rmtree() # 洗掉檔案 shutil.move() #移動檔案 shutil.make_archive(base_name="/tmp/code.bak",format="zip",root_dir="../Modules",owner="root") #創建壓縮包
Zipfile 壓縮模塊
import zipfile import os z = zipfile.ZipFile("/tmp/test_copy.zip","w") #壓縮 filelist = [] for root_dir,dirs,files in os.walk("../Modules"): #.代表當前目錄 for name in files: filelist.append(os.path.join(root_dir,name)) for i in filelist: print(i) z.write(i) z.close() z = zipfile.ZipFile("/tmp/test_copy.zip",'r') #解壓 z.extractall(path="/root") z.close()
牛逼的Re正則模塊
Re.match 從頭開始匹配 Re.findall 匹配所有值 匹配出所有的值以串列回傳 Re.search 包含匹配 匹配出來第一個就回傳 Re.split 以匹配到的字符當做串列分隔符 re.split("[0-9]","alex3jack4rain5mack") ['alex', 'jack', 'rain', 'mack'] Re.sub 匹配字符并替換 re.sub("abc","ABc","abcabcerrr") 'ABcABcerrr' re.sub("abc","ABc","abcabcerrr",count=1) 'ABcabcerrr' Re.fullmatch j精確匹配 re.fullmatch("abc","abc") 相當于re.search("^abc$",”abc”)
'.' 匹配任意除\n之外的任意字符
'^' 匹配開頭
'$' 匹配結尾
'*' 匹配前一個字符0次或多次
'+' 匹配前一個字符1次或多次
'?' 匹配前一個字符0次或1次
'{m}' 匹配前一個字符m次
'{n,m}' 匹配前一個字符n次到m次
'{|}' 匹配或
'{}'分組匹配 re.search(“(abc){1}a(123|45)”,”abcabca12345”)
'\A'只從字符開頭匹配
'\Z' 相當于$ 匹配字符結尾 re.search("\Aabc\Z","abc") 只能是abc
[] re.search("[a-zA-z0-9]{11}","131414fsq3144f")
'\d' 匹配數字0-9 re.search("\d+","d3425") +一次或多次 ?一次或0次 0一次或多次
'\D' 匹配非數字 re.findall("\D+","1324fs1sadf31fds")
'\w' re.search("\w+","123qrt135") 匹配[a-zA-z0-9]
'\W' 匹配非[a-zA-z0-9]
'\s'匹配 空白字符 \t \n \r
a= re.search("(?P<province>[0-9]{3})(?P<city>[0-9]{3})(?P<birt>[0-9]{4})",id_num)
a.group()
'1504301998'
a.groups()
('150', '430', '1998')
a.groupdict() re.split("[0-9]","alex3jack4rain5mack")
['alex', 'jack', 'rain', 'mack']
{'province': '150', 'city': '430', 'birt': '1998'}
Re.compile 制定匹配規則 ,直接拿來用.適合非常大的資料量,匹配規則還是一樣的
p = re.compile("\w{11}")
p.search("1234567892134658")
<re.Match object; span=(0, 11), match='12345678921'>
Flags 標志符
re.search("elf","alexrwfElf",re.I) re.I忽略大小寫
re.search("^alex","\nalexjackrain",re.M)
<re.Match object; span=(1, 5), match='alex'> re.M多行模式 search只搜索第一行
re.search(".","\n",re.S) re.S 可以匹配\n
軟體專案的目錄設計規范
目的:
1. 可讀性高
2. 可維護性高
Bin/ 存放專案的一些可執行檔案 腳本之類的
Docs/存放,使用的檔案
Conf/ 存放組態檔
Setup.py 安裝 部署 打包的腳本
Requirements.txt 存放軟體依賴的外部python包串列 自動生成這個檔案 pip freeze > requirements.txt 使用這個檔案 pip install -r requirements.txt
README 專案說明檔案
Bin/ 存放專案的一些可執行檔案 腳本之類的
Test/ 存放目錄的源代碼
Docs/存放,使用的檔案
Conf/ 存放組態檔
Setup.py 安裝 部署 打包的腳本
Requirements.txt 存放軟體依賴的外部python包串列 自動生成這個檔案 pip freeze > requirements.txt 使用這個檔案 pip install -r requirements.txt
README 專案說明檔案
包&跨模塊代碼呼叫
>>> import mypackage
------welcome invoke my first package
>>> from mypackage import fir
哈哈
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145088.html
標籤:Python
上一篇:Python腳本實作郵件報警功能
下一篇:微信機器人之PC微信hook
