python內置模塊~shutil

shutil

--High-level file operations,高級的文件操做模塊~
shutil 模塊的使用主要包括對文件及目錄的移動、複製、打包、壓縮(解壓)、刪除等操做。是對os模塊的一個補充~python

使用示例

shutil.copyfileobj(fsrc, fdst[, length])

複製一個文件到另外一個文件。
 
copyfileobj函數源碼:python2.7

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)

示例:ide

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 進行復制略顯麻煩,源文件和目標文件都須要打開(open)才能進行復制操做~函數

shutil.copyfile(src, dst)

一樣是複製操做~
 
示例:日誌

import shutil

f_src = '/Users/luyi/tmp/a.txt'
f_dest = '/Users/luyi/tmp/b.txt'
shutil.copyfile(f_src, f_dest)

相比於 copyfileobj,copyfile 實現的複製操做要簡單的多,在平常的使用中,也是更多的使用 copyfile 函數。其實在內部,copyfile 函數調用了 copyfileobj函數~code

shutil.copymode(src, dst)

複製文件的權限,即讀寫權限,不會複製源文件的內容及屬主和屬組~orm

示例:對象

➜  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

複製權限的過程,源文件和目標文件都必須存在,若目標文件不存在,則會報錯。這裏區別於 copyfile 函數,copyfile函數的目標文件能夠存在也能夠不存在,不存在則直接進行復制,若存在則進行覆蓋~遞歸

➜  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'

shutil.copystat(src, dst)

複製文件的全部狀態信息,包括 mode bits,atime,mtime,flags,但不復制文件內容,以及文件的屬主和屬組~ip

➜ 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')     # 執行復制狀態操做

stat 輸出的信息中包含3個時間,其中第一個是atime,第二個是mtime,最後一個是ctime。複製完成後,查看兩個文件的狀態信息:

➜ 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 已經複製到 b.txt 上,文件的屬主和屬組 並無發生變化。其中文件的 ctime 由系統自行維護~

shutil.copy(src, dst)

複製文件的內容以及權限,即先 copyfile,而後再 copymode~

shutil.copy2(src, dst)

複製文件的內容以及文件的狀態信息,先 copyfile,再 copystat~

shutil.copytree(src, dst, symlinks=False, ignore=None)

遞歸的複製目錄,以及文件的全部狀態信息(不包括文件的屬主和屬組)
示例:

➜  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

shutil.rmtree(path[, ignore_errors[, onerror]])

遞歸的刪除文件~
示例:

➜ 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至關於 rm -fr 命令,謹慎操做~

shutil.move(src, dst)

遞歸的移動文件,做用與經過move命令移動目錄相似~
示例:

➜  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

shutil.make_archive(base_name, format,root_dir=None,...)

打包或壓縮文件,而且返回操做後的文件路徑~
 
參數說明:
  base_name:壓縮包的文件名(abc.tar.gz,則base_name爲abc),也能夠是絕對路徑;如果文件名,則壓縮後的文件默認存放於當前目錄,如果絕對路徑,則壓縮有的文件就保存到指定路徑~
  format:指定壓縮或打包的類型,"zip","tar","bztar","gztar"
  root_dir:須要壓縮的文件或目錄路徑
  owner:屬主,默認爲當前用戶
  group:屬組,默認爲當前組
  logger:指定日誌對象,一般是logging.Logger對象~
 
示例:

➜  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

.................^_^

相關文章
相關標籤/搜索