Python模塊——shutil模塊詳解


本文大綱
os模塊是Python標准庫中一個重要的模塊,里面提供了對目錄和文件的一般常用操作。而Python另外一個標准庫——shutil庫,它作為os模塊的補充,提供了復制、移動、刪除、壓縮、解壓等操作,這些 os 模塊中一般是沒有提供的。但是需要注意的是:shutil 模塊對壓縮包的處理是調用 ZipFile 和 TarFile這兩個模塊來進行的。

 

 

 

知識串講

本文所使用的素材,都是基於以下2個文件夾,其中一個文件夾為空。

 

 

 

1)模塊導入

1 import shutil

2)復制文件

  • 函數:shutil.copy(src,dst)
  • 含義:復制文件;
  • 參數:src表示源文件,dst表示目標文件夾;
  • 注意:當移動到一個不存在的“目標文件夾”,系統會將這個不存在的“目標文件夾”識別為新的文件夾,而不會報錯;
 1 # 1.將a表的“data.txt”移動到b表  2 src = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_a\data.txt"
 3 dst = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_b"
 4 
 5 shutil.copy(src,dst)  6 ------------------------------------------------------------
 7 # 2.將a表的“data.txt”移動到b表,並重新命名為“new_data.txt”  8 src = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_a\data.txt"
 9 dst = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_b\new_data.txt"
10 
11 shutil.copy(src,dst) 12 ------------------------------------------------------------
13 # 3.將a表的“data.txt”移動到“不存在”的文件夾 14 src = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_a\data.txt"
15 dst = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_c"
16 
17 shutil.copy(src,dst) 18 """ 19 注意:對於情況3,系統會默認將“test_shutil_c”識別為文件名,而不是按照我們認為的,移動到一個新的不存在的文件夾。 20 """

結果如下:

 

 

 

3)復制文件夾

  • 函數:shutil.copytree(src,dst)
  • 含義:復制文件夾;
  • 參數:src表示源文件夾,dst表示目標文件夾;
  • 注意:這里只能是移動到一個空文件夾,而不能是包含其他文件的非空文件夾,否則會報錯PermissionError;

① 如果目標文件夾中存在其他文件,會報錯;

1 # 將a文件夾移動到b文件夾,由於前面的操作,此時b文件夾中已經有其他文件 2 src = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_a"
3 dst = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_b"
4 
5 shutil.copytree(src,dst)

結果如下:

 

 

 ② 如果指定任意一個目標文件夾,則會自動創建;

1 # c文件夾原本是不存在的,我們使用了下方的代碼,會自動創建該文件夾 2 src = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_a"
3 dst = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_c"
4 
5 shutil.copytree(src,dst)

結果如下:

 

 

 

4)移動文件或文件夾

  • 函數:shutil.move(src,dst)
  • 含義:移動文件/文件夾;
    – 參數:src表示源文件/文件夾,dst表示目標文件夾;
  • 注意:文件/文件夾一旦被移動了,原來位置的文件/文件夾就沒了。目標文件夾不存在時,會報錯;
1 # 將當前工作目錄下的“a.xlsx”文件,移動到a文件夾下
2 dst = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_a"
3 shutil.move("a.xlsx",dst) 4 ----------------------------------------------------------------
5 # 將a文件夾下的“a.xlsx”文件,移動到b文件夾中,並重新命名為“aa.xlsx”
6 src = r"C:/Users/黃偉/Desktop/publish/os模塊/test_shutil_a\a.xlsx"
7 dst = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_b\aa.xlsx"
8 shutil.move(src,dst)

結果如下:

 

 

 注意:移動文件夾操作類似,我這里就不贅述了,自行下去學習。

5)刪除文件夾(慎用)

  • 函數:shutil.rmtree(src)
  • 含義:刪除文件夾;
  • 參數:src表示源文件夾;

注意:區別這里和os模塊中remove()、rmdir()的用法,remove()方法只能刪除某個文件,mdir()只能刪除某個空文件夾。但是shutil模塊中的rmtree()可以遞歸徹底刪除非空文件夾;

1 # 將c文件夾徹底刪除
2 src = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_c"
3 shutil.rmtree(src)

結果如下:

 

 

 

6)創建和解壓壓縮包

  • zipobj.write():創建一個壓縮包;
  • zipobj.namelist():讀取壓縮包中的文件信息;
  • zipobj.extract():將壓縮包中的單個文件,解壓出來;
  • zipobj.extractall():將壓縮包中所有文件,解壓出來;
  • shutil 模塊對壓縮包的處理是調用 ZipFile 和 TarFile這兩個模塊來進行的,因此需要導入這兩個模塊;
  • 注意:這里所說的壓縮包,指的是“.zip”格式的壓縮包;

① 創建一個壓縮包

1 import zipfile 2 import os 3 file_list = os.listdir(os.getcwd()) 4 # 將上述所有文件,進行打包,使用“w”
5 with zipfile.ZipFile(r"我創建的壓縮包.zip", "w") as zipobj: 6     for file in file_list: 7         zipobj.write(file)

結果如下:

 

 

 ② 讀取壓縮包中的文件信息

1 import zipfile 2 
3 with zipfile.ZipFile("我創建的壓縮包.zip", "r") as zipobj: 4     print(zipobj.namelist())

結果如下:

 

 

 

③ 將壓縮包中的單個文件,解壓出來
  • 注意:目標文件夾不存在,會自動創建;
1 import zipfile 2 # 將壓縮包中的“test.ipynb”文件,單獨解壓到a文件夾下
3 dst = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_a"
4 with zipfile.ZipFile("我創建的壓縮包.zip", "r") as zipobj: 5     zipobj.extract("test.ipynb",dst)

結果如下:

 

 

④ 將壓縮包中所有文件,解壓出來;
  • 注意:目標文件夾不存在,會自動創建;
1 import zipfile 2 # 將壓縮包中的所有文件,解壓到d文件夾下
3 dst = r"C:\Users\黃偉\Desktop\publish\os模塊\test_shutil_d"
4 with zipfile.ZipFile("我創建的壓縮包.zip", "r") as zipobj: 5     zipobj.extractall(dst)

結果如下:

 


免責聲明!

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



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