day 16 包,random,shutil
包:
函式過多,可以分模組檔案去管理函式,模組檔案過多,將模組檔案分類放在一個個的資料夾中,這個資料夾就叫做包,組織結構更加清晰,合理!
模式就是被別人使用,包既然是一些模組的集合,也是被呼叫。
檔案:
1、 被別人使用
2、當做指令碼自己使用
執行檔案執行時,會將執行檔案的當前目錄記載到sys.path的列表中
包也是模組,他是模組的集合體,所以引用包也會反生三件事情:
1、建立一個以包名命名的名稱空間
2、執行包中的__init__檔案,將__init__裡面的程式碼塊,載入到以包名命名的名稱空間中
3、呼叫包內的名字必須通過包名. 的方式
# 想要在此檔案引用 bbb包的m3模組 怎麼做? # 第一步 在此檔案 import aaa # 第二步:在aaa 的 __init__ 新增 from aaa import bbb # 第三步:在bbb 的 __init__ 新增 from aaa.bbb import m3 # 完成以上三步,那麼我在此執行檔案就可以引用bbb包的m3模組裡面的名字。 # aaa.bbb.m3.func3() # 上面的需求滿可以這麼做: # from aaa.bbb import func3 # m3.func3()
總結:
1、from a.b import c . 的左邊一定十個包,import後面一定是一個具體的名字
2、包裡面的__init__ 如果想要引用模組,必須是 from.... import ....
3、from a.b.c.d import e.f.g 錯誤,import右邊不能有點(.)
4、form a.b.c.d import e
相對匯入和絕對匯入:
# 絕對匯入 from NB1.m1 import f1,f2 # 這樣匯入是為了讓 00程式碼草稿 訪問 # 如果只是在NB1的__init__使用,直接from m1 import f1, f2 即可 from NB1.m2 import f3,f4 from NB1.m3 import f5,f6 # 相對匯入 from .m1 import f1,f2 from .m2 import f3,f4 from .m3 import f5,f6
總結:
絕對匯入: 以執行檔案的sys.path為起始點開始匯入,稱之為絕對匯入
優點: 執行檔案與被匯入的模組中都可以使用
缺點: 所有匯入都是以sys.path為起始點,匯入麻煩
相對匯入: 參照當前所在檔案的資料夾為起始開始查詢,稱之為相對匯入
符號: .代表當前所在檔案的檔案加,..代表上一級資料夾,...代表上一級的上一級資料夾
優點: 匯入更加簡單
缺點: 只能在匯入包中的模組時才能使用
import random:
# print(random.random()) # 大於0且小於1之間的小數 # print(random.uniform(1,3)) # #大於1小於3的小數 # print(random.randint(1,5)) # 大於等於1且小於等於5之間的整數 # print(random.randrange(1,10,2)) # 10以內的奇數 # print(random.choice(['alex','wusir','日天'])) # 多選一 # print(random.sample(['alex','wusir','日天','太白'],2)) # 多選多
# 打亂列表順序 l1 = [1,2,3,4,'alex'] random.shuffle(l1) print(l1)
生成隨機驗證碼
def cond(): cond1 = '' for i in range(4): l1 = random.randrange(10) l2 = chr(random.randrange(97,122)) # ASCII碼 a~z 對應 97~122 l3 = chr(random.randrange(65,90)) # 大寫 A~Z single = random.choice([l1,l2,l3]) cond1 += str(single) print(cond1) cond()
import shutil
shutil.copyfileobj(fsrc, fdst[, length])
將檔案內容拷貝到另一個檔案中
import shutil shutil.copyfileobj(open('file1','r'),open('file2','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)
拷貝檔案和許可權
shutil.copy('f1.log', 'f2.log')
shutil.copy2(src, dst)
拷貝檔案和狀態資訊
shutil.copy2('f1.log', 'f2.log')
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
遞迴的去拷貝資料夾
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目標目錄不能存在,注意對folder2目錄父級目錄要有可寫許可權,ignore的意思是排除
shutil 對壓縮包的處理是呼叫 ZipFile 和 TarFile 兩個模組來進行的,詳細:
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() zipfile壓縮解壓縮
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() tarfile壓縮解壓縮