1. 程式人生 > >day 16 包,random,shutil

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壓縮解壓縮
複製程式碼