python 中使用 shutil 實現文件或目錄的複製、刪除、移動

原文鏈接:https://docs.python.org/2/library/shutil.html#module-shutil

 

shutil 模塊 提供了多個針對文件或文件集合的高等級操作。 尤其是,文件的複製和刪除操作。 對於獨立文件的操作, 參考 os 模塊

警告: 即使是更高等級的文件複製功能 ( shutil.copy(), shutil.copy2() ) 也不能複製所有文件的元數據(metadata)。 在 POSIX 平臺上,這意味着文件的屬主和用戶組會丟失,ACLs也一樣。 在 Mac OS 上, 由於沒有使用 the resource fork 和其他元數據,因此意味着 resources 會丟失以及文件類型和創建者ID將不會保持原有狀態。 在 Windows 上, 文件所有者, ACLs 以及交換數據流(alternate data streams) 不會被複制。

文件夾和文件複製

shutil.copyfileobj(fsrc, fdst[, length])

複製類文件(file-like)對象 fsrc 的內容到類文件對象 fdst。 可選整數參數 length, 指定緩衝區大小。具體而言, length 的值爲負數,複製操作不會將源數據分塊進行復制。 默認的,爲了避免不可控制的內存消耗,數據會被分塊存入chunk中。 注意: 如果 fsrc 對象的當前文件位置不爲 0 ,則只有從當前文件位置到文件末位的內容會被複制。

shutil.copyfile(src, dst)

複製文件 src 的內容(不包含元素據)到文件 dst 中。 dst 必須爲一個完整的目標文件。 如果要將文件複製目標文件夾中,查看 shutil.copy() 。 src 和 dst 不能爲同一個文件,否則會報錯。 目標文件位置必須爲可寫狀態,否則會觸發 IOError。 如果 dst 已經存在,則會被覆蓋。 特別的, 字符設備、塊設備和管道不能使用此方法複製。 使用字符串指定src 和 dst 路徑。

shutil.copymode(src, dst)

複製 src 的文件權限位到 dst 。 文件的內容、屬主和用戶組不會受影響。 使用字符串指定src 和 dst 路徑。

shutil.copystat(src, dst)

複製文件 src 的文件權限位最後訪問 access 時間最後修改 modification 時間和**標識 flags **到 dst。文件的內容、屬主和用戶組不會受影響。 使用字符串指定src 和 dst 路徑。

shutil.copy(src, dst)

複製文件 src 到 dst 文件或文件夾中。 如果 dst 是文件夾, 則會在文件夾中創建或覆蓋一個文件,且該文件與 src 的文件名相同。 文件權限位會被複制。使用字符串指定src 和 dst 路徑。

shutil.copy2(src, dst)

與 shutil.copy() 類似,另外會同時複製文件的元數據。 實際上,該方法是 shutil.copy() 和 shutil.copystat() 組合。該方法相當於 Unix 命令的 ` cp -p `。

shutil.ignore_patterns(*patterns)

該工廠函數創建了一個可以被調用的函數, 該函數可以用於 shutil.copytree() 的 ** ignore 參數**的值, 以跳過正確匹配的文件和文件夾。 更多參考下面離職。

shutil.copytree(src, dst, symlinks=False, ignore=None)

遞歸複製整個 src 文件夾。 目標文件夾名爲 dst,不能已經存在;方法會自動創建 dst 根文件夾。 文件夾權限和時間通過 shutil.copystat() 複製, 單獨的文件通過 shutil.copy2() 複製。 如果 ` symlinks ` 爲真, 源文件夾中的符號鏈接將會被保留,但是原鏈接的元數據不會被複制。如果值爲假或被省略,則鏈接文件指向文件的內容和元數據複製到新文件夾樹中。 如果指定了 ignore, 那麼他必須是調用隊列(callable),且作爲 shutil.copytree() 的參數。參數包括文件夾本機及並通過 os.listdir()返回文件夾包含的內容。由於 shutil.copytree() 遞歸複製,因此 ignore 會在複製每個子文件夾的時候被調用。 callable必須返回一個由當前文件夾下的文件夾和文件所組成的隊列(i.e. a subset of the items in the second argument); 這些文件夾和文件在複製過程中會被忽略。可以使用 shutil.ignore_patterns() 創建callable。

如果發生意外, shutil.Error() 返回錯誤原因。

該源碼應該被當作一個示例而不是最終的工具。

Changed in version 2.3: Error is raised if any exceptions occur during copying, rather than printing a message. Changed in version 2.5: Create intermediate directories needed to create dst, rather than raising an error. Copy permissions and times of directories using copystat(). Changed in version 2.6: Added the ignore argument to be able to influence what is being copied.

移動和刪除

shutil.rmtree(path[, ignore_errors[, onerror]])

刪除整個目錄樹; path 必須指向一個文件夾,但不能是一個指向文件夾的符號鏈接。 如果 ` ignore_errors ` 值爲真, 則刪除失敗時的信息將會被忽略。如果值爲假或省略,那麼這些錯誤將通過 onerror 指定的 handler 進行處理; 如果 onerror 被省略,則會 raise 一個異常。

如果指定了 onerror,則必須是包含三個參數: function, path 和 excinfo的 callable 。 第一個參數 ` function ` , 該函數用於 raise 異常;該函數可以是 os.path.islink(), os.listdir(), os.remove(), os.rmdir()。 第二個參數 path 爲傳遞給第一個參數的路徑。 第三個參數 excinfo 爲 sys.exc_info()返回的異常信息。 通過 onerror raise 的異常不會被捕捉。

Changed in version 2.6: Explicitly check for path being a symbolic link and raise OSError in that case.

shutil.move(src, dst)

將一個文件或文件夾從 src 移動到 dst 如果 dst 已存在且爲文件夾,則 src 將會被移動到 dst內。 如果如 dst 存在但不是一個文件夾, 取決於 os.rename() 的語義,dst 可能會被覆蓋。 如果 dst 與 src 在相同的文件系統下, 則使用 os.rename() 。 否認則,將使用 shutil.copy2() 複製 src到 dst 並刪除。

shutil.Error 

該異常彙集文件操作時 raise 的異常。 例如 shutil.copytree(), the exception argument is a list of 3-tuples (srcname, dstname, exception).

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章