Python shutil模塊


shutil模塊下 copy(復制)、rm(刪除)、move(移動) 常用方法舉例。

copyfileobj(fsrc, fdst[, length])
copyfile(src, dst, *, follow_symlinks=True)
copymode(src, dst, *, follow_symlinks=True)
copystat(src, dst, *, follow_symlinks=True)
copy(src, dst, *, follow_symlinks=True)
copy2(src, dst, *, follow_symlinks=True)
copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,ignore_dangling_symlinks=False)
rmtree(path, ignore_errors=False, onerror=None)
move(src, dst, copy_function=copy2)




shutil模塊(高級文件操作)

 

copy (復制)

 

copyfileobj(fsrc, fdst[, length])


文件對象的復制,fsrc和fdst是open打開的文件對象,復制內容。fdst要求可寫。
length指定了表示buffer的大小
源碼:

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)
        if not buf:
            break
        fdst.write(buf)

  

只要傳入的src文件不為空,就把讀取的內容寫入dst

舉例:

In [11]: with open('test1','w') as f1:
    ...:     f1.write('hello\nPython')
    ...:     

In [13]: with open('test1','a+') as f1:
    ...:     f1.write('\nMagedu')
    ...:     f1.flush()
    ...:     f1.seek(0)
    ...:     with open('test2','w') as f2:
    ...:         shutil.copyfileobj(f1,f2)
    ...:  

  

copyfile

復制文件內容,不含元信息。src、dst必須為文件的路徑字符串,而不是 _io.TextIOWrapper
本質上調用的就是copyfileobj,二進制內容復制

源碼主要部分:

def copyfile(src, dst, *, follow_symlinks=True):
	.....
        with open(src, 'rb') as fsrc:
            with open(dst, 'wb') as fdst:
                copyfileobj(fsrc, fdst)
	......

舉例:

In [6]: shutil.copyfile('test1','test2')
Out[6]: 'test2'

In [7]: ll
總用量 32
-rw-rw-r-- 1 python     5 10月 28 11:50 test1
-rw-rw-r-- 1 python     5 10月 28 11:51 test2

  

copymode

僅僅復制權限
舉例:

In [8]: os.chmod('test2',0o600)

In [9]: ll
總用量 32
-rw-rw-r-- 1 python     5 10月 28 11:50 test1
-rw------- 1 python     5 10月 28 11:51 test2

In [10]: shutil.copymode('test2','test1')

In [11]: ll
總用量 32
-rw------- 1 python     5 10月 28 11:50 test1
-rw------- 1 python     5 10月 28 11:51 test2

  


copystat

復制元數據及權限
舉例:

In [12]: os.chmod('test1',0o666)  #修改test1權限為666

In [13]: ll
-rw-rw-rw- 1 python     5 10月 28 11:50 test1
-rw------- 1 python     5 10月 28 11:51 test2

In [14]: !stat test1   #test1元信息
  文件:"test1"
  大小:5         	塊:8          IO 塊:4096   普通文件
設備:fd00h/64768d	Inode:1423520     硬鏈接:1
權限:(0666/-rw-rw-rw-)  Uid:( 1000/  python)   Gid:( 1000/  python)
最近訪問:2017-10-28 11:50:59.727245005 +0800
最近更改:2017-10-28 11:50:47.415746323 +0800
最近改動:2017-10-28 11:56:12.610665000 +0800
創建時間:-

In [15]: !stat test2    #test2元信息與test1不同
  文件:"test2"
  大小:5         	塊:8          IO 塊:4096   普通文件
設備:fd00h/64768d	Inode:1423521     硬鏈接:1
權限:(0600/-rw-------)  Uid:( 1000/  python)   Gid:( 1000/  python)
最近訪問:2017-10-28 11:51:29.014500749 +0800
最近更改:2017-10-28 11:51:29.014500749 +0800
最近改動:2017-10-28 11:53:37.444865005 +0800
創建時間:-

In [16]: shutil.copystat('test1','test2')  #copy元信息及權限

In [17]: !stat test1  #對比拷貝后的權限及元信息
  文件:"test1"
  大小:5         	塊:8          IO 塊:4096   普通文件
設備:fd00h/64768d	Inode:1423520     硬鏈接:1
權限:(0666/-rw-rw-rw-)  Uid:( 1000/  python)   Gid:( 1000/  python)
最近訪問:2017-10-28 11:50:59.727245005 +0800
最近更改:2017-10-28 11:50:47.415746323 +0800
最近改動:2017-10-28 11:56:12.610665000 +0800
創建時間:-

In [18]: !stat test2  #拷貝后的test2元信息和權限和test1一致
  文件:"test2"
  大小:5         	塊:8          IO 塊:4096   普通文件
設備:fd00h/64768d	Inode:1423521     硬鏈接:1
權限:(0666/-rw-rw-rw-)  Uid:( 1000/  python)   Gid:( 1000/  python)
最近訪問:2017-10-28 11:50:59.727245005 +0800
最近更改:2017-10-28 11:50:47.415746323 +0800
最近改動:2017-10-28 11:57:01.582474472 +0800
創建時間:-

  

copy

復制文件內容、權限和部分元數據,不包括創建時間和修改時間。
follow_symlinks為False時,不跟隨源文件中的符號鏈接
本質上調用的就是:
copyfile(src, dst, follow_symlinks=follow_symlinks)
copymode(src, dst, follow_symlinks=follow_symlinks)

源碼:

def copy(src, dst, *, follow_symlinks=True):
	......
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst, follow_symlinks=follow_symlinks)
    copymode(src, dst, follow_symlinks=follow_symlinks)
    return dst

  

copy2

copy2比copy多了復制全部元數據:權限、屬主屬組、時間戳等信息
本質上也是調用:
copyfile(src, dst, follow_symlinks=follow_symlinks)
copystat(src, dst, follow_symlinks=follow_symlinks)


copytree

本身就是一個遞歸函數,遞歸復制目錄。默認調用copy2(src,dst),也就是帶更多的元數據復制。
src、dst必須時目錄,src必須存在,dst必須不存在
ignore = func,提供一個callable(src,names) -> ignored_names。提供一個函數,它會被調用。src是源目錄。names是os.listdir(src)的結果,就是列出src中的文件名,返回值是要被過濾的文件名的set類型數據

舉例:
忽略以t開頭的文件:

In [37]: def ignore_t(src,names):
    ...:     ig = filter(lambda x: x.startswith('t'),names)
    ...:     return set(ig)
    ...: 

In [38]: shutil.copytree('/home/python/magedu/project/cmdb/','/home/python/magedu/project/cmdb-bak/',ignore=ignore_t)
Out[38]: '/home/python/magedu/project/cmdb-bak/'

In [39]: !tree /home/python/magedu/project/cmdb
/home/python/magedu/project/cmdb
├── log
├── test1
├── test2
├── WordCount1.py
└── WordCount.py

1 directory, 4 files

In [40]: !tree /home/python/magedu/project/cmdb-bak
/home/python/magedu/project/cmdb-bak
├── log
├── WordCount1.py
└── WordCount.py

1 directory, 2 files

  


忽略所有目錄,只拷貝文件:

In [28]: def ig_t(dir,files):
    ...:     import os
    ...:     return [f for f in files if os.path.isfile(os.path.join(dir,f))]   #如果是文件類型就做為函數返回值返回
    ...: 

In [29]: shutil.copytree('/home/python/magedu/project/cmdb/','/home/python/magedu/project/cmdb-bak/',ignore=ig_t) 
Out[29]: '/home/python/magedu/project/cmdb-bak/'

In [30]: !tree /home/python/magedu/project/cmdb
/home/python/magedu/project/cmdb
├── log
├── test1
├── test2
├── WordCount1.py
└── WordCount.py

1 directory, 4 files

In [31]: !tree /home/python/magedu/project/cmdb-bak
/home/python/magedu/project/cmdb-bak
└── log

1 directory, 0 files

  

 


rm刪除


rmtree

遞歸刪除目錄(類似rm -rf,謹慎操作)
舉例:

In [41]: shutil.rmtree('/home/python/magedu/project/cmdb-bak')

In [42]: !tree /home/python/magedu/project/cmdb-bak
/home/python/magedu/project/cmdb-bak [error opening dir]

0 directories, 0 files

In [43]: !tree /home/python/magedu/project/
/home/python/magedu/project/
├── cmdb
│   ├── log
│   ├── test1
│   ├── test2
│   ├── WordCount1.py
│   └── WordCount.py
├── cmdb_bak
│   ├── log
│   ├── test1
│   ├── test2
│   ├── WordCount1.py
│   └── WordCount.py
└── django

5 directories, 8 files

  

move移動

move(src, dst, copy_function=copy2)

遞歸移動文件、目錄到目標,返回目標。本身使用的是os.rename方法。

 

os.rename

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)

舉例:

In [45]: os.rename('WordCount.py','/home/python/magedu/project/django/WordCount2.py')

In [46]: !tree /home/python/magedu/project/
/home/python/magedu/project/
├── cmdb
│   ├── log
│   ├── test1
│   ├── test2
│   └── WordCount1.py
├── cmdb_bak
│   ├── log
│   ├── test1
│   ├── test2
│   ├── WordCount1.py
│   └── WordCount.py
└── django
    └── WordCount2.py  #

5 directories, 8 files

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM