你會發現os只適用此環境的套件,無法實現跨平台處理。
而透過shutil套件不只實現了比os套件更好的路徑彈性,還可實踐網路檔案處理。
單純複製檔案:
import shutil
shutil.copy("123.py" , "abc")
shutil.copy("123.py" , "abc/456.py")
#123.py == 456.py
先剪下再貼上(搬移)
import shutil
shutil.move("123.txt" , "abc")
shutil.move("123.txt" , "abc/456.txt")
#456.txt內容等於123.txt
這就是批次處理檔案樹的方法了。
- copytree("此目錄" , "目標位置")
複製目錄內的所有檔案- rmtree("此目錄位置")
刪除該目錄內的所有檔案
此目錄:
可以是目錄 , 相同附檔名檔案 可達到批次複製效果
Ex:(整理此資料樹)
shutil有個特色:之前stdio有談到 * (萬用字元) 可替代全部省略內容。
但要小心不是所有套件都能省略喔
現在把檔案依據性質分類該怎麼做?
from shutil import *
import os
copytree("test01/text" , "text")
rmtree("test01/text") #省略shutil
os.mkdir("4dll")
os.mkdir("4py") #建立目標目錄
for i in range(0,10):
i+=1
move("test01/%d.dll" %i , "4dll/%d.dll" %i)
move("test01/s%d.py" %i , "4py/s%d.py" %i)
rmtree("test01")
#處理檔案還是要先確認目標目錄是否存在#
shutil強大在於它也可複製檔案的各種參數,而不複製內容:
- copymode("此檔案位置" , "目標檔案位置")
目標檔案需存在,複製內容:複製參數不複製權限- copystat("此檔案位置" , "目標檔案位置")
目標檔案需存在,複製內容:複製參數與權限- copy2("此檔案位置" , "目標檔案位置")
目標檔案可不存在,複製內容:複製參數與權限
copyfileobj("複製方法" , "目標處理方法")
它可以跟os的方法一起使用,且有更大的處理彈性(從目標 , 屬性 , 權限甚至跟別的套件一起使用)。
它的靈活性跟OOP的邏輯是一致的,所以class方法也可調用:
from shutil import *
import os
#生成文件複製
fold = open("old.txt" , "w+",encoding='UTF-8')
fold.write("123456789 is 我的密碼")
copyfileobj(open('old.txt', 'r+' , encoding='UTF-8') , open('new.bin', 'ab'))
fold.close()
try:
os.remove("old.txt")
except:
pass
try-except的用法是為了避免使用者執行不當導致非必要代碼出現了bug,使用此語法就可排除一些執行錯誤。
一般軟體開發也喜歡用此語法。