1. 程式人生 > >模組、包及常用模組(time/random/os/sys/shutil)

模組、包及常用模組(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()