模組、包及常用模組(time/random/os/sys/shutil)
一、模組
模組的本質就是一個.py 檔案。
匯入和呼叫模組:
import module from module import xx from module.xx.xx import xx as rename from module.xx.xx import *
模組呼叫時發生了三件事:
import 1.建立名稱空間 2.執行模組檔案 3.在執行檔案中建立一個名稱 指向模組的名稱空間 from 1.建立名稱空間 2.執行模組檔案 3.把模組中的名稱複製到當前名稱空間
注意:模組一旦被呼叫,即相當於執行了另外一個py檔案裡的程式碼
python中有三種模組: 1. 內建模組(內置於直譯器中,不用匯入,直接呼叫) 2. 第三方模組(在lib目錄下,匯入後可以呼叫) 3. 自定義模組(預設從當前工作目錄下匯入,匯入後可以呼叫) python直譯器對於模組的查詢也是遵循上面的順序。python模組豐富,後期涉及到的網路程式設計和執行緒程序,基本就是在學socket 和threading processing 這兩個模組
相對匯入和絕對匯入
絕對匯入的定義
從sys.path開始的完整路徑稱之為絕對匯入我們會發現1.如果你的包的層級比較複雜 寫起來很長2.假如有一天 你需要修改包名 你需要將所有匯入語句全改一遍為了解決這兩個問題 我們最好使用相對匯入
相對匯入的定義
相對於被匯入模組的路徑語法 .表示當前目錄 ..當前往上一級目錄 ...上上級 以此類推注意:建議不要超過三層相對匯入只能用於 包的內部模組之間相互匯入
二、包
包也是一種模組
對於使用者而言 使用方式和模組沒有任何區別
本質上就是一個資料夾 不同之處在於 多了一個__init__.py 叫包的初始化檔案。
在匯入包的時候 由於包實際上是一個資料夾 不能被執行 所以包中需要提供__init__.py檔案
該檔案用於代表這個包
所以上面import pack 實際上時執行了pack下的__init___.py 匯入了這個名稱
那麼問題來了,__init__.py 的作用是什麼?
__init__.py檔案的作用? ****** 說白了就是匯入該包下的所有模組 這樣一來使用包的人 用起來非常簡單 無需關心包中的檔案結構 只要匯入了包 就能使用包中的所有功能 __init__.py 應該包含什麼內容? 不應該包含任何的業務邏輯 僅僅用於匯入包中的模組
匯入語法:
pack.sayhello()
pack.m1.sayhi()
pack.sayhi()
pack.pack.m1
三、常用模組彙總
Time & Datetime 模組
Time模組:
三種表示方式:
1、時間戳
2、格式化的時間字串
3、元組(struct_time)共九個元素。
三種形式之間的轉換:
結構化>>>時間戳: time.mktime(time.localtime())時間戳>>>結構化: time.localtime() 預設傳入當前時間戳。
結構化>>>字串: time.strftime('%Y-%m-%d, time.localtime())字串>>>結構化: time.strptime('2016-06-21', '%Y-%m-%d')
另外兩外兩種轉化字串時間的方法: (老外習慣用的時間表示法)
time.asctime() 預設把當前結構時間轉化為字串
time.ctime() 預設把當前時間戳轉化為字串
time.sleep() 睡眠。其實是一種I/O阻塞(類似的,input也是一種I/O阻塞,阻塞時,CPU會被排程到其它任務,因此不佔CPU的)
Datetime模組
#時間加減 import datetime # print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925 #print(datetime.date.fromtimestamp(time.time()) ) # 時間戳直接轉成日期格式 如2018-10-15 # print(datetime.datetime.now() ) # print(datetime.datetime.now() + datetime.timedelta(3)) #當前時間+3天 # print(datetime.datetime.now() + datetime.timedelta(-3)) #當前時間-3天 # print(datetime.datetime.now() + datetime.timedelta(hours=3)) #當前時間+3小時 # print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #當前時間+30分 # c_time = datetime.datetime.now() # print(c_time.replace(minute=3,hour=2)) #時間替換
Random模組(生成隨機字串)
比如登入網站的隨機驗證碼,通過random模組可以很容易生成隨機字串隨機數生成的模組
常用的語法操作如下:
>>> random.randrange(1,10) #返回1-10之間的一個隨機數,不包括10 >>> random.randint(1,10) #返回1-10之間的一個隨機數,包括10 >>> random.randrange(0, 100, 2) #隨機選取0到100間的偶數 >>> random.random() #返回一個隨機浮點數 >>> random.choice('abce3#[email protected]') #返回一個給定資料集合中的隨機字元 >>> random.sample('abcdefghij',3) #從多個字元中選取特定數量的字元 ['a', 'd', 'b'] #洗牌 >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> random.shuffle(a) >>> a [3, 0, 7, 2, 1, 6, 5, 8, 9, 4]
小練習:
生成隨機字串
>>> import string >>> ''.join(random.sample(string.ascii_lowercase + string.digits, 6)) '4fvda1'
sys模組(直譯器相關資訊的模組)
sys.argv 命令列引數List,第一個元素是程式本身路徑 sys.exit(n) 退出程式,正常退出時exit(0) sys.version 獲取Python解釋程式的版本資訊 sys.maxint 最大的Int值 sys.path 返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值 sys.platform 返回作業系統平臺名稱 sys.stdout.write('please:') #標準輸出 , 引出進度條的例子, 注,在py3上不行,可以用print代替 val = sys.stdin.readline()[:-1] #標準輸入 sys.getrecursionlimit() #獲取最大遞迴層數 sys.setrecursionlimit(1200) #設定最大遞迴層數 sys.getdefaultencoding() #獲取直譯器預設編碼 sys.getfilesystemencoding #獲取記憶體資料存到檔案裡的預設編碼
os模組(與作業系統相關、對檔案的處理、對路徑的處理)
常用語法操作:
不帶path: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 獲取系統環境變數帶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的大小
注意:關於處理路徑的方法。
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) #方式二:不推薦使用 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
shutil模組(用於操作檔案、包括壓縮和解壓)
shutil.copyfileobj(fsrc, fdst[, length])將檔案內容拷貝到另一個檔案中
import shutil shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
shutil.copyfile(src, dst)拷貝檔案
shutil.copyfile('f1.log', 'f2.log') #目標檔案無需存在
shutil.copymode(src, dst)僅拷貝許可權。內容、組、使用者均不變
shutil.copymode('f1.log', 'f2.log') #目標檔案必須存在
shutil.copystat(src, dst)僅拷貝狀態的資訊,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log') #目標檔案必須存在
shutil.copy(src, dst)拷貝檔案和許可權
import shutil shutil.copy('f1.log', 'f2.log')
shutil.copy2(src, dst)拷貝檔案和狀態資訊
import shutil shutil.copy2('f1.log', 'f2.log')
shutil.ignore_patterns(*patterns)shutil.copytree(src, dst, symlinks=False, ignore=None)遞迴的去拷貝資料夾
import shutil shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目標目錄不能存在,注意對folder2目錄父級目錄要有可寫許可權,ignore的意思是排除
shutil.rmtree(path[, ignore_errors[, onerror]])遞迴的去刪除檔案
import shutil shutil.rmtree('folder1')
shutil.move(src, dst)遞迴的去移動檔案,它類似mv命令,其實就是重新命名。
import shutil shutil.move('folder1', 'folder3')
shutil.make_archive(base_name, format,...)建立壓縮包並返回檔案路徑,例如:zip、tar建立壓縮包並返回檔案路徑,例如:zip、tar
base_name: 壓縮包的檔名,也可以是壓縮包的路徑。只是檔名時,則儲存至當前目錄,否則儲存至指定路徑,
如 data_bak =>儲存至當前路徑如:/tmp/data_bak =>儲存至/tmp/
format: 壓縮包種類,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要壓縮的資料夾路徑(預設當前目錄)
owner: 使用者,預設當前使用者
group: 組,預設當前組
logger: 用於記錄日誌,通常是logging.Logger物件
#將 /data 下的檔案打包放置當前程式目錄
import shutil
ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')
#將 /data下的檔案打包放置 /tmp/目錄
import shutil
ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')若想放在指定目錄,在檔案前加上指定目錄的位置即可。
shutil 對壓縮包的處理是呼叫 ZipFile 和 TarFile 兩個模組來進行的,詳細:
zipfile壓縮&解壓縮
import zipfile # 壓縮 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close()
# 解壓
z = zipfile.ZipFile('laxi.zip', 'r') z.extractall(path='.') z.close()
tarfile壓縮&解壓縮
import tarfile # 壓縮 >>> t=tarfile.open('/tmp/egon.tar','w') >>> t.add('/test1/a.py',arcname='a.bak') >>> t.add('/test1/b.py',arcname='b.bak') >>> t.close()
# 解壓 >>> t=tarfile.open('/tmp/egon.tar','r') >>> t.extractall('/egon') >>> t.close()