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).