--High-level file operations,高級(jí)的文件操作模塊~
shutil 模塊的使用主要包括對(duì)文件及目錄的移動(dòng)、復(fù)制、打包、壓縮(解壓)、刪除等操作。是對(duì)os模塊的一個(gè)補(bǔ)充~

復(fù)制一個(gè)文件到另一個(gè)文件。
?
copyfileobj函數(shù)源碼:
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
buf = fsrc.read(length) # length 為緩沖大小
if not buf:
break
fdst.write(buf)示例:
import shutil
f_read = open(file='/Users/luyi/tmp/a.txt', mode='r')
f_write = open(file='/Users/luyi/tmp/b.txt', mode='w')
shutil.copyfileobj(f_read, f_write)使用 copyfileobj 進(jìn)行復(fù)制略顯麻煩,源文件和目標(biāo)文件都需要打開(kāi)(open)才能進(jìn)行復(fù)制操作~
同樣是復(fù)制操作~
?
示例:
import shutil
f_src = '/Users/luyi/tmp/a.txt'
f_dest = '/Users/luyi/tmp/b.txt'
shutil.copyfile(f_src, f_dest)相比于 copyfileobj,copyfile 實(shí)現(xiàn)的復(fù)制操作要簡(jiǎn)單的多,在日常的使用中,也是更多的使用 copyfile 函數(shù)。其實(shí)在內(nèi)部,copyfile 函數(shù)調(diào)用了 copyfileobj函數(shù)~
復(fù)制文件的權(quán)限,即讀寫(xiě)權(quán)限,不會(huì)復(fù)制源文件的內(nèi)容及屬主和屬組~
示例:
? ls -l
total 16
-rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt
-rw-r--r-- 1 root wheel 4 Nov 7 22:46 b.txt
>>> import shutil
>>> shutil.copymode('a.txt','b.txt')
? ls -l
total 16
-rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt
-rw-rw-r-- 1 root wheel 4 Nov 7 22:46 b.txt復(fù)制權(quán)限的過(guò)程,源文件和目標(biāo)文件都必須存在,若目標(biāo)文件不存在,則會(huì)報(bào)錯(cuò)。這里區(qū)別于 copyfile 函數(shù),copyfile函數(shù)的目標(biāo)文件可以存在也可以不存在,不存在則直接進(jìn)行復(fù)制,若存在則進(jìn)行覆蓋~
? tmp ll
total 8
-rw-r--r-- 1 baby staff 4B Nov 6 23:48 a.txt
>>> import shutil
>>> shutil.copymode('a.txt','b.txt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 91, in copymode
os.chmod(dst, mode)
OSError: [Errno 2] No such file or directory: 'b.txt'復(fù)制文件的所有狀態(tài)信息,包括 mode bits,atime,mtime,flags,但不復(fù)制文件內(nèi)容,以及文件的屬主和屬組~
? ls -l
total 16
-rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt
-rw-r--r-- 1 root wheel 4 Nov 7 22:50 b.txt
? stat a.txt
16777220 8603112152 -rw-rw-r-- 1 baby wheel 0 4 "Nov 7 22:48:16 2018" "Nov 7 22:46:22 2018" "Nov 7 22:46:46 2018" "Nov 7 22:46:06 2018" 4096 8 0 a.txt
? stat b.txt
16777220 8603112261 -rw-r--r-- 1 root wheel 0 4 "Nov 7 22:50:32 2018" "Nov 7 22:50:37 2018" "Nov 7 22:50:37 2018" "Nov 7 22:50:32 2018" 4096 8 0 b.txt
>>> import shutil
>>> shutil.copystat('a.txt','b.txt') # 執(zhí)行復(fù)制狀態(tài)操作stat 輸出的信息中包含3個(gè)時(shí)間,其中第一個(gè)是atime,第二個(gè)是mtime,最后一個(gè)是ctime。復(fù)制完成后,查看兩個(gè)文件的狀態(tài)信息:
? ls -l
total 16
-rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt
-rw-rw-r-- 1 root wheel 4 Nov 7 22:46 b.txt
? stat a.txt
16777220 8603112152 -rw-rw-r-- 1 baby wheel 0 4 "Nov 7 22:48:16 2018" "Nov 7 22:46:22 2018" "Nov 7 22:46:46 2018" "Nov 7 22:46:06 2018" 4096 8 0 a.txt
? stat b.txt
16777220 8603112261 -rw-rw-r-- 1 root wheel 0 4 "Nov 7 22:48:16 2018" "Nov 7 22:46:22 2018" "Nov 7 22:52:02 2018" "Nov 7 22:46:22 2018" 4096 8 0 b.txt可以看到源文件 a.txt 的 atime,mtime 和 mode bits 已經(jīng)復(fù)制到 b.txt 上,文件的屬主和屬組 并沒(méi)有發(fā)生變化。其中文件的 ctime 由系統(tǒng)自行維護(hù)~
復(fù)制文件的內(nèi)容以及權(quán)限,即先 copyfile,然后再 copymode~
復(fù)制文件的內(nèi)容以及文件的狀態(tài)信息,先 copyfile,再 copystat~
遞歸的復(fù)制目錄,以及文件的所有狀態(tài)信息(不包括文件的屬主和屬組)
示例:
? ls -l test1
total 16
-rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt
-rw-r--r-- 1 root wheel 4 Nov 7 22:56 b.txt
>>> import shutil
>>> shutil.copytree('test1', 'test2')
'test2'
? ls -l test2
total 16
-rw-rw-r-- 1 root wheel 4 Nov 7 22:46 a.txt
-rw-r--r-- 1 root wheel 4 Nov 7 22:56 b.txt遞歸的刪除文件~
示例:
? ls -l test1
total 16
-rw-rw-r-- 1 baby wheel 4 Nov 7 22:46 a.txt
-rw-r--r-- 1 root wheel 4 Nov 7 22:56 b.txt
>>> import shutil
>>> shutil.rmtree('test1')rmtree相當(dāng)于 rm -fr 命令,謹(jǐn)慎操作~
遞歸的移動(dòng)文件,作用與通過(guò)move命令移動(dòng)目錄類似~
示例:
? tmp ll
total 0
drwxr-xr-x 4 baby staff 128B Nov 7 23:09 test
>>> import shutil
>>> shutil.move('test','/Users/luyi')
'/Users/luyi/test'
? tmp ll /Users/luyi/test
total 16
-rw-r--r-- 1 baby staff 4B Nov 6 23:48 a.txt
-rw-r--r-- 1 baby staff 4B Nov 7 23:06 b.txt打包或壓縮文件,并且返回操作后的文件路徑~
?
參數(shù)說(shuō)明:
? base_name:壓縮包的文件名(abc.tar.gz,則base_name為abc),也可以是絕對(duì)路徑;若是文件名,則壓縮后的文件默認(rèn)存放于當(dāng)前目錄,若是絕對(duì)路徑,則壓縮有的文件就保存到指定路徑~
? format:指定壓縮或打包的類型,"zip","tar","bztar","gztar"
? root_dir:需要壓縮的文件或目錄路徑
? owner:屬主,默認(rèn)為當(dāng)前用戶
? group:屬組,默認(rèn)為當(dāng)前組
? logger:指定日志對(duì)象,通常是logging.Logger對(duì)象~
?
示例:
? tmp ll
total 0
drwxr-xr-x 4 baby staff 128B Nov 7 23:09 test
>>> import shutil
>>> shutil.make_archive(base_name='test',format='zip',root_dir='test')
'/Users/luyi/tmp/test.zip'
>>> shutil.make_archive(base_name='test',format='gztar',root_dir='test')
'/Users/luyi/tmp/test.tar.gz'
>>> shutil.make_archive(base_name='test',format='tar',root_dir='test')
'/Users/luyi/tmp/test.tar'
>>> shutil.make_archive(base_name='test',format='bztar',root_dir='test')
'/Users/luyi/tmp/test.tar.bz2'
? tmp ll
total 48
drwxr-xr-x 4 baby staff 128B Nov 7 23:09 test
-rw-r--r-- 1 baby staff 10K Nov 7 23:25 test.tar
-rw-r--r-- 1 baby staff 187B Nov 7 23:25 test.tar.bz2
-rw-r--r-- 1 baby staff 195B Nov 7 23:25 test.tar.gz
-rw-r--r-- 1 baby staff 206B Nov 7 23:25 test.zip.................^_^
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享文章:python內(nèi)置模塊~shutil-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://chinadenli.net/article34/eohpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、定制網(wǎng)站、做網(wǎng)站、網(wǎng)站營(yíng)銷、手機(jī)網(wǎng)站建設(shè)、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容