Python中的shutil模塊詳析
前言
Python的Shutil模塊可以看做是OS模塊的補充,它提供了對文件(夾)復制,移動,刪除,壓縮和解壓縮的方法。
下面本文會對shutil模塊的常用方法進行分類介紹。
一、文件復制
shutil模塊提供了多種文件復制方法,主要方法如下表:
1. shutil.copy(src, dst)
src為源文件路徑(必須是文件),dst為目標文件路徑(文件名可加可不加)
目標文件如存在會覆蓋掉,不存在會創(chuàng)建新文件,包括路徑
只copy內容和權限,其他文件屬性如時間沒有copy,注意權限是copy了
返回值為目標文件路徑
代碼示例如下:
shutil.copy('../class.py','./') #復制文件到當前目錄,注意dst為目標路徑 './class.py' os.listdir('./') #列出當前目錄的文件名信息,class.py已創(chuàng)建 ['test3', 'class.py', 'test2', 'function.py', 'function1.py', 'test1'] shutil.copy('../class.py','./class2.py') #復制文件并重命名,注意dst為文件名 './class2.py' os.listdir('./') #列出當前目錄的文件名信息,class2.py已創(chuàng)建 ['test3', 'class.py', 'test2', 'function.py', 'class2.py', 'function1.py', 'test1']
2. shutil.copyfile(src, dst)
src為源文件路徑(必須是文件),dst為目標文件路徑,且必須包含文件名
目標路徑不存在會報錯
返回值為目標文件路徑
代碼示例如下:
shutil.copyfile('../class.py','./class2.py') #用copyfile復制文件 './class2.py' shutil.copyfile('../class.py','./os/class2.py') #目標文件的目錄不存在會報錯 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/shutil.py", line 121, in copyfile with open(dst, 'wb') as fdst: FileNotFoundError: [Errno 2] No such file or directory: './os/class2.py' shutil.copyfile('../class.py','./') #dst不是文件而是目錄會報錯 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/shutil.py", line 121, in copyfile with open(dst, 'wb') as fdst: IsADirectoryError: [Errno 21] Is a directory: './'
3. shutil.copy2(src, dst)
- src為源文件路徑,dst為目標文件路徑
- 同時復制源文件的內容和stat信息(包含用戶,組,權限,時間信息等)
- 返回值為目標文件路徑
shutil.copy2()和shutil.copy()的用法很類似,不同點是shutil.copy2()不僅copy了源文件內容,同時copy了源文件的文件屬性,包括修改/訪問時間(創(chuàng)建時間貌似無法復制),權限等信息。shutil.copy2()相同于同時做了shutil.copy()和shutil.copystat(),因此該方法名字這里的copy2可以簡單記憶成2次copy。
下面是代碼舉例:
shutil.copy('../class.py','./class2.py') #用copy來復制文件 './class2.py' time.ctime(os.stat('../class.py').st_mtime) #返回源文件修改時間 'Sat Jun 8 17:30:32 2019' time.ctime(os.stat('./class2.py').st_mtime) #返回目標文件修改時間,和源文件不一樣 'Sun Sep 18 10:20:36 2022' shutil.copy2('../class.py','./class3.py') #用copy2來復制文件 './class3.py' time.ctime(os.stat('./class3.py').st_mtime) #返回目標文件修改時間,和源文件一樣 'Sat Jun 8 17:30:32 2019'
4. shutil.copyfileobj(fsrc, fdst,[length=*])
- fsrc為源文件句柄,fdst為目標文件句柄,length為copy內容大小
- 源文件和目標文件必須是已經打開的文件句柄
- 沒有返回值
shutil.copyfileobj()方法可以copy一個打開的文件到另一個打開的文件,注意源文件和目標文件參數均是文件句柄對象。
代碼示例如下:
file1=open('hr.py','r') #打開源文件 file2=open('hr1.py','w') #打開目標文件 shutil.copyfileobj(file1,file2) #文件復制,注意沒有返回值
5. shutil.copymode(src, dst)
- src為源文件路徑,dst為目標文件路徑,可以是文件或者目錄
- 目標文件必須已經存在,只復制權限信息,不復制內容,時間,用戶和組等信息
- 返回值為目標文件路徑
shutil.copymode()只會復制文件權限(st_mode信息),不會復制內容和其他屬性。
代碼示例如下:
os.system('chmod 777 ../class.py') #用shell指令將源文件的讀寫屬性改變 0 os.system('ls -l ../class.py') #打印源文件的屬性為-rwxrwxrwx -rwxrwxrwx 1 user user 527 6月 8 2019 ../class.py 0 shutil.copyfile('../class.py','./class4.py') #用copyfile來復制文件 './class4.py' os.system('ls -l ./class4.py') #打印目標文件屬性為-rw-r--r--,和源文件不一樣 -rw-r--r-- 1 user user 527 9月 18 10:40 ./class4.py 0 shutil.copymode('../class.py','./class4.py')#用copymode來復制文件權限 os.system('ls -l ./class4.py') #打印目標文件屬性為-rwxrwxrwx,和源文件一樣 -rwxrwxrwx 1 user user 527 9月 18 10:40 ./class4.py 0
6. shutil.copystat(src, dst)
- src為源文件路徑,dst為目標文件路徑,可以是文件或者目錄
- 目標文件必須已經存在,只復制stat信息,包含權限,時間,組,用戶等,不復制內容
- 返回值為目標文件路徑
shutil.copystat()相比shutil.mode(),同樣也不復制內容,不同的是它除了復制權限信息,其他stat信息包括修改時間等也按同樣復制。
代碼示例如下:
shutil.copyfile('../class.py','./class5.py') #復制文件 './class5.py' os.system('ls -l ../class.py') #打印源文件信息 -rwxrwxrwx 1 user user 527 6月 8 2019 ../class.py 0 os.system('ls -l ./class5.py') #打印目標文件信息,權限和時間和源文件不一樣 -rw-r--r-- 1 user user 527 9月 18 10:48 ./class5.py 0 shutil.copystat('../class.py','./class5.py') #復制文件stat到目標文件 os.system('ls -l ./class5.py') #打印目標文件信息,權限和時間和源文件一樣 -rwxrwxrwx 1 user user 527 6月 8 2019 ./class5.py 0
7. shutil.copytree(src, dst,ignore=none,copy_function=shutil.copy2)
- src為源路徑,dst為目標路徑,目標路徑必須不存在
- ignore必須是一個可調用對象,shutil.copytree()每次遞歸訪問文件夾時,會將當前目錄和目錄的os.listdir()作為參數調用一次ignore,該可調用對象必須返回一個相對于當前目錄的目錄和文件 名序列(即其第二個參數的子集);隨后這些名稱將在拷貝進程中被忽略。如ignore=shutil.ignore_patterns('*.py'),代表以.py結尾的文件或者文件夾都不會復制。
- copy_function可以選擇shutil.copy2或者shutil.copy模式進行copy,默認是shutil.copy2
- 返回值為目標文件路徑
shutil.copytree()會遞歸復制以src為根起點的整個目錄樹到名為dst的目錄并返回目標目錄,注意src必須是目錄,dst必須不能已存在。如果復制過程中需要忽略某些文件可以使用ignore參數,注意ignore后面需要接可調用對象,該對象可以是一個自定義的函數,函數的參數有2個,當前目錄,和當前目錄的os.listdir(),函數返回的是需要ignore的文件名。該函數也可以用shutil自帶的shutil.ignore_patterns('*patterns')。
代碼示例如下:
shutil.copytree('/home/user/Python','/home/user/Python1',ignore=None,copy_function=shutil.copy) '/home/user/Python1' os.listdir('/home/cfzhu/Python1') #列出copy后的文件夾中的文件 ['dictionary.py', 'abnormal.py', 'aa.json', '.file.py.swp', '.print.py.swp', 'hello.py', 'class.py', 'input.py', 'function.py', 'shutil', '.abnormal.py.swo', 'os', 'file.py', 'file2', 'print.py', 'file1', '__pycache__', 'import.py', '.abnormal.py.swp', 'file3', 'hr.py', 'tk.py', 'aa1.json'] shutil.copytree('/home/user/Python','/home/user/Python2',ignore=shutil.ignore_patterns('*.py'),copy_function=shutil.copy2) '/home/user/Python2' os.listdir('/home/user/Python2') #copy后的文件名沒有"*py"結尾的文件 ['aa.json', '.file.py.swp', '.print.py.swp', 'shutil', '.abnormal.py.swo', 'os', 'file2', 'file1', '__pycache__', '.abnormal.py.swp', 'file3', 'aa1.json']
二、文件移動和刪除
1. shutil.move(src,dst)
- src為源文件路徑,dst為目標文件路徑,兩者都可以是文件或者目錄
- 返回值為目標文件路徑
代碼如下(示例):
shutil.move('hr.py','hr1.py') #移動文件 'hr1.py' shutil.move('./shutil','./shutil1') #移動文件夾 './shutil1'
2. shutil.rmtree(src)
- src為源文件路徑
- 沒有返回值
shutil模塊中的rmtree()可以遞歸徹底刪除非空文件夾,需要慎重使用
代碼如下:
os.listdir() ['.bashrc', 'Python2', '.cache', 'Python1', 'hr_py'] shutil.rmtree('./Python2/') #遞歸刪除文件夾的所有內容 os.listdir() #文件夾已刪除 [.bashrc', '.cache', 'Python1', 'hr_py']
三、文件壓縮和解壓縮
1. shutil.make_archive(base_name,format,dir)
- base_name為源文件路徑
- format為壓縮格式,可以是"zip", "tar", "gztar","bztar", or "xztar"
- dir為壓縮后的文件路徑
- 返回壓縮后文件路徑
shutil.make_archive()可以將文件或者文件夾進行壓縮,壓縮格式可選,注意壓縮源文件并不會刪除源文件。
代碼如下(示例):
os.listdir() ['shutil1', 'hr2.py', 'function.py'] shutil.make_archive('./shutil1','zip','./') #壓縮文件為zip格式 '/home/cfzhu/Python/shutil1.zip'
2. shutil.unpack_archive(filename,extract_dir=None, format=None)
- filename為源文件路徑
- extract_dir為提取后的路徑,默認當前路徑
- format為壓縮格式,可以是"zip", "tar", "gztar","bztar", or "xztar",不指定默認為根據源文件后綴
- 返回壓縮后文件路徑
shutil.unpack_archive()可以將壓縮文件解壓縮。
代碼如下(示例):
shutil.unpack_archive('./shutil1.zip','./shutil2') #解壓縮 os.listdir() ['shutil1', 'dictionary.py', 'shutil2', 'abnormal.py', 'aa.json', '.file.py.swp', '.print.py.swp', 'shutil1.zip', ]
總結
以上就是shutil的常見方法的介紹,包含了文件復制,文件移動和刪除以及文件壓縮和解壓縮三大部分。
文中每個方法都提供了實例演示,希望能對大家有所幫助。
到此這篇關于Python中的shutil模塊詳析的文章就介紹到這了,更多相關Python的shutil模塊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
matplotlib中plt.hist()參數解釋及應用實例
本文主要介紹了matplotlib中plt.hist()參數解釋及應用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08利用Python制作動態(tài)排名圖的實現(xiàn)代碼
這篇文章主要介紹了利用Python制作動態(tài)排名圖的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04python實現(xiàn)對求解最長回文子串的動態(tài)規(guī)劃算法
這篇文章主要為大家詳細介紹了python實現(xiàn)對求解最長回文子串的動態(tài)規(guī)劃算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06