iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
0

shutil套件

你會發現os只適用此環境的套件,無法實現跨平台處理。
而透過shutil套件不只實現了比os套件更好的路徑彈性,還可實踐網路檔案處理。

  • copy("此檔案位置" , "目標檔案位置")

單純複製檔案:

import shutil
shutil.copy("123.py" , "abc") 
shutil.copy("123.py" , "abc/456.py")  
#123.py == 456.py
  • move("此檔案位置" , "目標檔案位置")

先剪下再貼上(搬移)

import shutil
shutil.move("123.txt" , "abc")
shutil.move("123.txt" , "abc/456.txt")
#456.txt內容等於123.txt

shutil(tree)

這就是批次處理檔案樹的方法了。

  • copytree("此目錄" , "目標位置")
    複製目錄內的所有檔案
  • rmtree("此目錄位置")
    刪除該目錄內的所有檔案

此目錄:可以是目錄 , 相同附檔名檔案 可達到批次複製效果
Ex:(整理此資料樹)https://ithelp.ithome.com.tw/upload/images/20191009/20117399z4q3B8BwIO.png
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

shutil強大在於它也可複製檔案的各種參數,而不複製內容:

  • copymode("此檔案位置" , "目標檔案位置")
    目標檔案需存在,複製內容:複製參數不複製權限
  • copystat("此檔案位置" , "目標檔案位置")
    目標檔案需存在,複製內容:複製參數與權限
  • copy2("此檔案位置" , "目標檔案位置")
    目標檔案可不存在,複製內容:複製參數與權限
  • copyfileobj

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,使用此語法就可排除一些執行錯誤。
一般軟體開發也喜歡用此語法。


上一篇
[D28] pythonOS:檔案控制
下一篇
[D30] pythonOS:系統指令和應用
系列文
從寫程式到脫離菜雞的歷練(以python為主的資處與檔案權限)32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言