?shutil --- 高階文件操作?

源代碼:?Lib/shutil.py


shutil?模塊提供了一系列對文件和文件集合的高階操作。 特別是提供了一些支持文件拷貝和刪除的函數。 對于單個文件的操作,請參閱?os?模塊。

警告

即便是高階文件拷貝函數 (shutil.copy(),?shutil.copy2()) 也無法拷貝所有的文件元數據。

在 POSIX 平臺上,這意味著將丟失文件所有者和組以及 ACL 數據。 在 Mac OS 上,資源鉤子和其他元數據不被使用。 這意味著將丟失這些資源并且文件類型和創建者代碼將不正確。 在 Windows 上,將不會拷貝文件所有者、ACL 和替代數據流。

目錄和文件操作

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

將文件類對象?fsrc?的內容拷貝到文件類對象?fdst。 整數值?length?如果給出則為緩沖區大小。 特別地,?length?為負值表示拷貝數據時不對源數據進行分塊循環處理;默認情況下會分塊讀取數據以避免不受控制的內存消耗。 請注意如果?fsrc?對象的當前文件位置不為 0,則只有從當前文件位置到文件末尾的內容會被拷貝。

shutil.copyfile(src,?dst,?*,?follow_symlinks=True)

將名為?src?的文件的內容(不包括元數據)拷貝到名為?dst?的文件并以盡可能高效的方式返回?dst。?src?和?dst?均為路徑類對象或以字符串形式給出的路徑名。

dst?必須是完整的目標文件名;對于接受目標目錄路徑的拷貝請參見?copy()。 如果?src?和?dst?指定了同一個文件,則將引發?SameFileError。

目標位置必須是可寫的;否則將引發?OSError?異常。 如果?dst?已經存在,它將被替換。 特殊文件如字符或塊設備以及管道無法用此函數來拷貝。

如果?follow_symlinks?為假值且?src?為符號鏈接,則將創建一個新的符號鏈接而不是拷貝?src?所指向的文件。

引發一個?審計事件?shutil.copyfile?附帶參數?src,?dst

在 3.3 版更改:?曾經是引發?IOError?而不是?OSError。 增加了?follow_symlinks?參數。 現在是返回?dst

在 3.4 版更改:?引發?SameFileError?而不是?Error。 由于前者是后者的子類,此改變是向后兼容的。

在 3.8 版更改:?可能會在內部使用平臺專屬的快速拷貝系統調用以更高效地拷貝文件。 參見?依賴于具體平臺的高效拷貝操作?一節。

exception?shutil.SameFileError

此異常會在?copyfile()?中的源和目標為同一文件時被引發。

3.4 新版功能.

shutil.copymode(src,?dst,?*,?follow_symlinks=True)

從?src?拷貝權限位到?dst。 文件的內容、所有者和分組將不受影響。?src?和?dst?均為路徑類對象或字符串形式的路徑名。 如果?follow_symlinks?為假值,并且?src?和?dst?均為符號鏈接,copymode()?將嘗試修改?dst?本身的模式(而非它所指向的文件)。 此功能并不是在所有平臺上均可用;請參閱?copystat()?了解詳情。 如果?copymode()?無法修改本機平臺上的符號鏈接,而它被要求這樣做,它將不做任何操作即返回。

引發一個?審計事件?shutil.copymode?附帶參數?src,?dst

在 3.3 版更改:?加入?follow_symlinks?參數。

shutil.copystat(src,?dst,?*,?follow_symlinks=True)

從?src?拷貝權限位、最近訪問時間、最近修改時間以及旗標到?dst。 在 Linux上,copystat()?還會在可能的情況下拷貝“擴展屬性”。 文件的內容、所有者和分組將不受影響。?src?和?dst?均為路徑類對象或字符串形式的路徑名。

如果?follow_symlinks?為假值,并且?src?和?dst?均指向符號鏈接,copystat()?將作用于符號鏈接本身而非該符號鏈接所指向的文件 — 從?src?符號鏈接讀取信息,并將信息寫入?dst?符號鏈接。

備注

并非所有平臺者提供檢查和修改符號鏈接的功能。 Python 本身可以告訴你哪些功能是在本機上可用的。

  • 如果?os.chmod?in?os.supports_follow_symlinks?為?True,則?copystat()?可以修改符號鏈接的權限位。

  • 如果?os.utime?in?os.supports_follow_symlinks?為?True,則?copystat()?可以修改符號鏈接的最近訪問和修改時間。

  • 如果?os.chflags?in?os.supports_follow_symlinks?為?True,則?copystat()?可以修改符號鏈接的旗標。 (os.chflags?不是在所有平臺上均可用。)

在此功能部分或全部不可用的平臺上,當被要求修改一個符號鏈接時,copystat()?將盡量拷貝所有內容。?copystat()?一定不會返回失敗信息。

更多信息請參閱?os.supports_follow_symlinks。

引發一個?審計事件?shutil.copystat?附帶參數?src,?dst

在 3.3 版更改:?添加了?follow_symlinks?參數并且支持 Linux 擴展屬性。

shutil.copy(src,?dst,?*,?follow_symlinks=True)

將文件?src?拷貝到文件或目錄?dst。?src?和?dst?應為?路徑類對象?或字符串。 如果?dst?指定了一個目錄,文件將使用?src?中的基準文件名拷貝到?dst?中。 如果?dst?指定了一個已存在的文件,它將被替換。 返回新創建文件所對應的路徑。

如果?follow_symlinks?為假值且?src?為符號鏈接,則?dst?也將被創建為符號鏈接。 如果?follow_symlinks?為真值且?src?為符號鏈接,dst?將成為?src?所指向的文件的一個副本。

copy()?會拷貝文件數據和文件的權限模式 (參見?os.chmod())。 其他元數據,例如文件的創建和修改時間不會被保留。 要保留所有原有的元數據,請改用?copy2()?。

引發一個?審計事件?shutil.copyfile?附帶參數?src,?dst

引發一個?審計事件?shutil.copymode?附帶參數?src,?dst

在 3.3 版更改:?添加了?follow_symlinks?參數。 現在會返回新創建文件的路徑。

在 3.8 版更改:?可能會在內部使用平臺專屬的快速拷貝系統調用以更高效地拷貝文件。 參見?依賴于具體平臺的高效拷貝操作?一節。

shutil.copy2(src,?dst,?*,?follow_symlinks=True)

類似于?copy(),區別在于?copy2()?還會嘗試保留文件的元數據。

當?follow_symlinks?為假值,并且?src?為符號鏈接時,copy2()?會嘗試將來自?src?符號鏈接的所有元數據拷貝到新創建的?dst?符號鏈接。 但是,此功能不是在所有平臺上均可用。 在此功能部分或全部不可用的平臺上,copy2()?將盡量保留所有元數據,copy2()?一定不會由于無法保留文件元數據而引發異常。

copy2()?會使用?copystat()?來拷貝文件元數據。 請參閱?copystat()?了解有關修改符號鏈接元數據的平臺支持的更多信息。

引發一個?審計事件?shutil.copyfile?附帶參數?src,?dst

引發一個?審計事件?shutil.copystat?附帶參數?src,?dst

在 3.3 版更改:?添加了?follow_symlinks?參數,還會嘗試拷貝擴展文件系統屬性(目前僅限 Linux)。 現在會返回新創建文件的路徑。

在 3.8 版更改:?可能會在內部使用平臺專屬的快速拷貝系統調用以更高效地拷貝文件。 參見?依賴于具體平臺的高效拷貝操作?一節。

shutil.ignore_patterns(*patterns)

這個工廠函數會創建一個函數,它可被用作?copytree()?的?ignore?可調用對象參數,以忽略那些匹配所提供的 glob 風格的?patterns?之一的文件和目錄。 參見以下示例。

shutil.copytree(src,?dst,?symlinks=False,?ignore=None,?copy_function=copy2,?ignore_dangling_symlinks=False,?dirs_exist_ok=False)

遞歸地將以?src?為根起點的整個目錄樹拷貝到名為?dst?的目錄并返回目標目錄。 所需的包含?dst?的中間目錄在默認情況下也將被創建。

目錄的權限和時間會通過?copystat()?來拷貝,單個文件則會使用?copy2()?來拷貝。

如果?symlinks?為真值,源目錄樹中的符號鏈接會在新目錄樹中表示為符號鏈接,并且原鏈接的元數據在平臺允許的情況下也會被拷貝;如果為假值或省略,則會將被鏈接文件的內容和元數據拷貝到新目錄樹。

當?symlinks?為假值時,如果符號鏈接所指向的文件不存在,則會在拷貝進程的末尾將一個異常添加到?Error?異常中的錯誤列表。 如果你希望屏蔽此異常那就將可選的?ignore_dangling_symlinks?旗標設為真值。 請注意此選項在不支持?os.symlink()?的平臺上將不起作用。

如果給出了?ignore,它必須是一個可調用對象,該對象將接受?copytree()?所訪問的目錄以及?os.listdir()?所返回的目錄內容列表作為其參數。 由于?copytree()?是遞歸地被調用的,ignore?可調用對象對于每個被拷貝目錄都將被調用一次。 該可調用對象必須返回一個相對于當前目錄的目錄和文件名序列(即其第二個參數的子集);隨后這些名稱將在拷貝進程中被忽略。?ignore_patterns()?可被用于創建這種基于 glob 風格模式來忽略特定名稱的可調用對象。

如果發生了(一個或多個)異常,將引發一個附帶原因列表的?Error。

如果給出了?copy_function,它必須是一個將被用來拷貝每個文件的可調用對象。 它在被調用時會將源路徑和目標路徑作為參數傳入。 默認情況下,copy2()?將被使用,但任何支持同樣簽名(與?copy()?一致)都可以使用。

如果?dirs_exist_ok?為(默認的)假值且?dst?已存在,則會引發?FileExistsError。 如果?dirs_exist_ok?為真值,則如果拷貝操作遇到已存在的目錄時將繼續執行,并且在?dst?目錄樹中的文件將被?src?目錄樹中對應的文件所覆蓋。

引發一個?審計事件?shutil.copytree?附帶參數?src,?dst

在 3.3 版更改:?當?symlinks?為假值時拷貝元數據。 現在會返回?dst

在 3.2 版更改:?添加了?copy_function?參數以允許提供定制的拷貝函數。 添加了?ignore_dangling_symlinks?參數以便在?symlinks?為假值時屏蔽目標不存在的符號鏈接。

在 3.8 版更改:?可能會在內部使用平臺專屬的快速拷貝系統調用以更高效地拷貝文件。 參見?依賴于具體平臺的高效拷貝操作?一節。

3.8 新版功能:?dirs_exist_ok?形參。

shutil.rmtree(path,?ignore_errors=False,?οnerrοr=None,?*,?onexc=None,?dir_fd=None)

刪除一個完整的目錄樹;path?必須指向一個目錄(但不能是一個目錄的符號鏈接)。 如果?ignore_errors?為真值,則刪除失敗導致的錯誤將被忽略;如果為假值或被省略,則此類錯誤將通過調用由?onexc?或?onerror?所指定的處理句柄來處理,或者如果此參數被省略,異常將被傳播給調用方。

本函數支持?基于目錄描述符的相對路徑。

備注

在支持必要的基于 fd 的函數的平臺上,默認會使用?rmtree()?的可防御符號鏈接攻擊的版本。 在其他平臺上,rmtree()?較易遭受符號鏈接攻擊:給定適當的時間和環境,攻擊者可以操縱文件系統中的符號鏈接來刪除他們在其他情況下無法訪問的文件。 應用程序可以使用?rmtree.avoids_symlink_attacks?函數屬性來確定此類情況具體是哪一些。

如果提供了?onexc,它必須為接受三個形參的可調用對象:?function,?path?和?excinfo

第一個形參?function?是引發異常的函數;它依賴于具體的平臺和實現。 第二個形參?path?將為傳遞給?function?的路徑名稱。 第三個形參?excinfo?是被引發的異常。 由?onexc?所引發的異常將不會被捕獲。

已棄用的?onerror?與?onexc?類似,區別在于它接受的第三個形參是從?sys.exc_info()?返回的元組。

引發了個?審計事件?shutil.rmtree,附帶參數?path,?dir_fd

在 3.3 版更改:?添加了一個防御符號鏈接攻擊的版本,如果平臺支持基于 fd 的函數就會被使用。

在 3.8 版更改:?在 Windows 上將不會再在移除連接之前刪除目錄連接中的內容。

在 3.11 版更改:?dir_fd?參數。

在 3.12 版更改:?增加了?onexc?形參,棄用了?onerror

rmtree.avoids_symlink_attacks

指明當前平臺和實現是否提供防御符號鏈接攻擊的?rmtree()?版本。 目前它僅在平臺支持基于 fd 的目錄訪問函數時才返回真值。

3.3 新版功能.

shutil.move(src,?dst,?copy_function=copy2)

遞歸地將一個文件或目錄 (src) 移至另一位置 (dst) 并返回目標位置。

如果目標是已存在的目錄,則?src?會被移至該目錄下。 如果目標已存在但不是目錄,它可能會被覆蓋,具體取決于?os.rename()?的語義。

如果目標是在當前文件系統中,則會使用?os.rename()。 在其他情況下,src?將被拷貝至?dst,使用的函數為?copy_function,然后目標會被移除。 對于符號鏈接,則將在?dst?之下或以其本身為名稱創建一個指向?src?目標的新符號鏈接,并且?src?將被移除。

如果給出了?copy_function,則它必須為接受兩個參數?src?和?dst?的可調用對象,并將在?os.rename()?無法使用時被用來將?src?拷貝到?dst。 如果源是一個目錄,則會調用?copytree(),并向它傳入?copy_function。 默認的?copy_function?是?copy2()。 使用?copy()?作為?copy_function?允許在無法附帶拷貝元數據時讓移動操作成功執行,但其代價是不拷貝任何元數據。

引發一個?審計事件?shutil.move?附帶參數?src,?dst

在 3.3 版更改:?為異類文件系統添加了顯式的符號鏈接處理,以便使它適應 GNU 的?mv?的行為。 現在會返回?dst

在 3.5 版更改:?增加了?copy_function?關鍵字參數。

在 3.8 版更改:?可能會在內部使用平臺專屬的快速拷貝系統調用以更高效地拷貝文件。 參見?依賴于具體平臺的高效拷貝操作?一節。

在 3.9 版更改:?接受一個?path-like object?作為?src?和?dst

shutil.disk_usage(path)

返回給定路徑的磁盤使用統計數據,形式為一個?named tuple,其中包含?total,?used?和?free?屬性,分別表示總計、已使用和未使用空間的字節數。?path?可以是一個文件或是一個目錄。

備注

在 Unix 文件系統中,path?必須指向一個?已掛載?文件系統分區中的路徑。 在這些平臺上,CPython 不會嘗試從未掛載的文件系統中獲取磁盤使用信息。

3.3 新版功能.

在 3.8 版更改:?在 Windows 上,path?現在可以是一個文件或目錄。

可用性: Unix, Windows。

shutil.chown(path,?user=None,?group=None)

修改給定?path?的所有者?user?和/或?group

user?可以是一個系統用戶名或 uid;group?同樣如此。 要求至少有一個參數。

另請參閱下層的函數?os.chown()。

引發一個?審計事件?shutil.chown?附帶參數?path,?user,?group

可用性: Unix。

3.3 新版功能.

shutil.which(cmd,?mode=os.F_OK?|?os.X_OK,?path=None)

返回當給定的?cmd?被調用時將要運行的可執行文件的路徑。 如果沒有?cmd?會被調用則返回?None

mode?是一個傳遞給?os.access()?的權限掩碼,在默認情況下將確定文件是否存在并且為可執行文件。

當未指定?path?時,將會使用?os.environ()?的結果,返回 "PATH" 值或回退為?os.defpath。

在 Windows 上,如果?mode?不包括?os.X_OK?則會將當前目錄添加到?path?中。 當?mode?包括?os.X_OK?時,則將通過 Windows API?NeedCurrentDirectoryForExePathW?來確定當前目錄是否應當添加到?path?中。 要避免在當前工作目錄下查找可執行文件:可設置?NoDefaultCurrentDirectoryInExePath?環境變量。

在 Windows 上,還會使用?PATHEXT?變量來查找尚未包括某個擴展名的命令。 舉例來說,如果你調用?shutil.which("python"),which()?將搜索?PATHEXT?以獲知應當在?path?中查找?python.exe。 例如,在 Windows 上:

>>>

>>> shutil.which("python")
'C:\\Python33\\python.EXE'

這也適用于當?cmd?是一個包含目錄組成部分路徑的情況:

>> shutil.which("C:\\Python33\\python")
'C:\\Python33\\python.EXE'

3.3 新版功能.

在 3.8 版更改:?現在可以接受?bytes?類型。 如果?cmd?的類型為?bytes,結果的類型也將為?bytes。

在 3.12 版更改:?在 Windows 上,如果?mode?包括?os.X_OK?且 WinAPI?NeedCurrentDirectoryForExePathW(cmd)?為假值則不會再將當前目錄添加到搜索路徑中,否則即使當前目錄已經在搜索路徑中仍會再次添加它;現在?PATHEXT?即使當?cmd?包括目錄組成部分或以?PATHEXT?中的擴展名結束時仍然會被使用;并且沒有擴展名的文件名現在也能被找到。

在 3.12.1 版更改:?在 Windows 上,如果?mode?包括?os.X_OK,則帶有?PATHEXT?中的擴展名的可執行文件將優先于不包含匹配的擴展名的可執行文件。 這將帶來更接近于 Python 3.11 的行為。

exception?shutil.Error

此異常會收集在多文件操作期間所引發的異常。 對于?copytree(),此異常參數將是一個由三元組 (srcname,?dstname,?exception) 構成的列表。

依賴于具體平臺的高效拷貝操作

從 Python 3.8 開始,所有涉及文件拷貝的函數 (copyfile(),?copy(),?copy2(),?copytree()?以及?move()) 將會使用平臺專屬的 "fast-copy" 系統調用以便更高效地拷貝文件 (參見?bpo-33671)。 "fast-copy" 意味著拷貝操作將發生于內核之中,避免像在 "outfd.write(infd.read())" 中那樣使用 Python 用戶空間的緩沖區。

在 macOS 上將會使用?fcopyfile?來拷貝文件內容(不含元數據)。

在 Linux 上將會使用?os.sendfile()。

在 Windows 上?shutil.copyfile()?將會使用更大的默認緩沖區(1 MiB 而非 64 KiB)并且會使用基于?memoryview()?的?shutil.copyfileobj()?變種形式。

如果快速拷貝操作失敗并且沒有數據被寫入目標文件,則 shutil 將在內部靜默地回退到使用效率較低的?copyfileobj()?函數。

在 3.8 版更改.

copytree 示例

一個使用?ignore_patterns()?輔助函數的例子:

from shutil import copytree, ignore_patternscopytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))

這將會拷貝除?.pyc?文件和以?tmp?打頭的文件或目錄以外的所有條目.

另一個使用?ignore?參數來添加記錄調用的例子:

from shutil import copytree
import loggingdef _logpath(path, names):logging.info('Working in %s', path)return []   # nothing will be ignoredcopytree(source, destination, ignore=_logpath)

rmtree 示例

這個例子演示了如何在 Windows 上刪除一個目錄樹,其中部分文件設置了只讀屬性位。 它會使用 onexc 回調函數來清除只讀屬性并再次嘗試刪除。 任何后續的失敗都將被傳播。

import os, stat
import shutildef remove_readonly(func, path, _):"Clear the readonly bit and reattempt the removal"os.chmod(path, stat.S_IWRITE)func(path)shutil.rmtree(directory, onexc=remove_readonly)

歸檔操作

3.2 新版功能.

在 3.5 版更改:?添加了對?xztar?格式的支持。

本模塊也提供了用于創建和讀取壓縮和歸檔文件的高層級工具。 它們依賴于?zipfile?和?tarfile?模塊。

shutil.make_archive(base_name,?format[,?root_dir[,?base_dir[,?verbose[,?dry_run[,?owner[,?group[,?logger]]]]]]])

創建一個歸檔文件(例如 zip 或 tar)并返回其名稱。

base_name?是要創建的文件名稱,包括路徑,去除任何特定格式的擴展名。?format?是歸檔格式:為 "zip" (如果?zlib?模塊可用), "tar", "gztar" (如果?zlib?模塊可用), "bztar" (如果?bz2?模塊可用) 或 "xztar" (如果?lzma?模塊可用) 中的一個。

root_dir?是一個目錄,它將作為歸檔文件的根目錄,歸檔中的所有路徑都將是它的相對路徑;例如,我們通常會在創建歸檔之前用 chdir 命令切換到?root_dir

base_dir?是我們要執行歸檔的起始目錄;也就是說?base_dir?將成為歸檔中所有文件和目錄共有的路徑前綴。?base_dir?必須相對于?root_dir?給出。 請參閱?使用 base_dir 的歸檔程序示例?了解如何同時使用?base_dir?和?root_dir

root_dir?和?base_dir?默認均為當前目錄。

如果?dry_run?為真值,則不會創建歸檔文件,但將要被執行的操作會被記錄到?logger

owner?和?group?將在創建 tar 歸檔文件時被使用。 默認會使用當前的所有者和分組。

logger?必須是一個兼容?PEP 282?的對象,通常為?logging.Logger?的實例。

verbose?參數已不再使用并進入棄用狀態。

引發一個?審計事件?shutil.make_archive?并附帶參數?base_name,?format,?root_dir,?base_dir

備注

此函數在通過?register_archive_format()?注冊的自定義歸檔程序不支持?root_dir?參數時時不是線程安全的。 在這種情況下它會臨時改變進程的當前工作目錄到?root_dir?來執行歸檔操作。

在 3.8 版更改:?現在對于通過?format="tar"?創建的歸檔文件將使用新式的 pax (POSIX.1-2001) 格式而非舊式的 GNU 格式。

在 3.10.6 版更改:?目前此函數在創建標準?.zip?和 tar 歸檔文件期間會確保是線程安全的。

shutil.get_archive_formats()

返回支持的歸檔格式列表。 所返回序列中的每個元素為一個元組?(name,?description)

默認情況下?shutil?提供以下格式:

  • zip: ZIP 文件(如果?zlib?模塊可用)。

  • tar: 未壓縮的 tar 文件。 對于新歸檔文件將使用 POSIX.1-2001 pax 格式。

  • gztar: gzip 壓縮的 tar 文件(如果?zlib?模塊可用)。

  • bztar: bzip2 壓縮的 tar 文件(如果?bz2?模塊可用)。

  • xztar: xz 壓縮的 tar 文件(如果?lzma?模塊可用)。

你可以通過使用?register_archive_format()?注冊新的格式或為任何現有格式提供你自己的歸檔器。

shutil.register_archive_format(name,?function[,?extra_args[,?description]])

為?name?格式注冊一個歸檔器。

function?是將被用來解包歸檔文件的可調用對象。 該可調用對象將接收要創建文件的?base_name,再加上要歸檔內容的?base_dir?(其默認值為?os.curdir)。 更多參數會被作為關鍵字參數傳入:?owner,?group,?dry_run?和?logger?(與向?make_archive()?傳入的參數一致)。

如果?function?將自定義屬性?function.supports_root_dir?設為?True,則會以關鍵字參數形式傳遞?root_dir?參數。 否則進程的當前工作目錄將在調用?function?之前被臨時更改為?root_dir。 在此情況下?make_archive()?將不是線程安全的。

如果給出了?extra_args,則其應為一個?(name,?value)?對的序列,將在歸檔器可調用對象被使用時作為附加的關鍵字參數。

description?由?get_archive_formats()?使用,它將返回歸檔器的列表。 默認值為一個空字符串。

在 3.12 版更改:?增加了對支持?root_dir?參數的函數的支持。

shutil.unregister_archive_format(name)

從支持的格式中移除歸檔格式?name

shutil.unpack_archive(filename[,?extract_dir[,?format[,?filter]]])

解包一個歸檔文件。?filename?是歸檔文件的完整路徑。

extract_dir?是歸檔文件解包的目標目錄名稱。 如果未提供,則將使用當前工作目錄。

format?是歸檔格式:應為 "zip", "tar", "gztar", "bztar" 或 "xztar" 之一。 或者任何通過?register_unpack_format()?注冊的其他格式。 如果未提供,unpack_archive()?將使用歸檔文件的擴展名來檢查是否注冊了對應于該擴展名的解包器。 在未找到任何解包器的情況下,將引發?ValueError。

僅限關鍵字參數?filter?將被傳給下層的解包函數。 對于 zip 文件,filter?將不被接受。 對于 tar 文件,推薦將其設為?'data',除非使用了 tar 專屬的特征且為 UNIX 類文件系統。 (請參閱?解壓縮過濾器?了解詳情。)?'data'?將在 Python 3.14 中成為 tar 文件的默認過濾器。

引發一個?審計事件?shutil.unpack_archive?附帶參數?filename,?extract_dir,?format

警告

絕不要未經預先檢驗就從不可靠的源中提取歸檔文件。 這樣有可能會在?extract_dir?參數所指定的路徑之外創建文件,例如某些成員具有以 "/" 打頭的絕對路徑文件名或是以兩個點號 ".." 打頭的文件名。

在 3.7 版更改:?接受一個?path-like object?作為?filename?和?extract_dir

在 3.12 版更改:?增加了?filter?參數。

shutil.register_unpack_format(name,?extensions,?function[,?extra_args[,?description]])

注冊一個解包格式。?name?為格式名稱而?extensions?為對應于該格式的擴展名列表,例如 Zip 文件的擴展名為?.zip

function?是將被用于解包歸檔的可調用對象。 該可調用對象將接受:

  • 歸檔的路徑,為位置參數;

  • 歸檔要提取到的目錄,為位置參數;

  • 可選的?filter?關鍵字參數,如果有提供給?unpack_archive()?的話;

  • 額外的關鍵字參數,由?(name,?value)?元組組成的序列?extra_args?指明。

可以提供?description?來描述該格式,它將被?get_unpack_formats()?返回。

shutil.unregister_unpack_format(name)

撤銷注冊一個解包格式。?name?為格式的名稱。

shutil.get_unpack_formats()

返回所有已注冊的解包格式列表。 所返回序列中的每個元素為一個元組?(name,?extensions,?description)

默認情況下?shutil?提供以下格式:

  • zip: ZIP 文件(只有在相應模塊可用時才能解包壓縮文件)。

  • tar: 未壓縮的 tar 文件。

  • gztar: gzip 壓縮的 tar 文件(如果?zlib?模塊可用)。

  • bztar: bzip2 壓縮的 tar 文件(如果?bz2?模塊可用)。

  • xztar: xz 壓縮的 tar 文件(如果?lzma?模塊可用)。

你可以通過使用?register_unpack_format()?注冊新的格式或為任何現有格式提供你自己的解包器。

歸檔程序示例

在這個示例中,我們創建了一個 gzip 壓縮的 tar 歸檔文件,其中包含用戶的?.ssh?目錄下的所有文件:

>>>

>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
>>> make_archive(archive_name, 'gztar', root_dir)
'/Users/tarek/myarchive.tar.gz'

結果歸檔文件中包含有:

$ tar -tzvf /Users/tarek/myarchive.tar.gz
drwx------ tarek/staff       0 2010-02-01 16:23:40 ./
-rw-r--r-- tarek/staff     609 2008-06-09 13:26:54 ./authorized_keys
-rwxr-xr-x tarek/staff      65 2008-06-09 13:26:54 ./config
-rwx------ tarek/staff     668 2008-06-09 13:26:54 ./id_dsa
-rwxr-xr-x tarek/staff     609 2008-06-09 13:26:54 ./id_dsa.pub
-rw------- tarek/staff    1675 2008-06-09 13:26:54 ./id_rsa
-rw-r--r-- tarek/staff     397 2008-06-09 13:26:54 ./id_rsa.pub
-rw-r--r-- tarek/staff   37192 2010-02-06 18:23:10 ./known_hosts

使用?base_dir?的歸檔程序示例

在這個例子中,與?上面的例子?類似,我們演示了如何使用?make_archive(),但這次是使用?base_dir。 我們現在具有如下的目錄結構:

$ tree tmp
tmp
└── root└── structure├── content└── please_add.txt└── do_not_add.txt

在最終的歸檔中,應當會包括?please_add.txt,但不應當包括?do_not_add.txt。 因此我們使用以下代碼:

>>>

>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> make_archive(
...     archive_name,
...     'tar',
...     root_dir='tmp/root',
...     base_dir='structure/content',
... )
'/Users/tarek/my_archive.tar'

列出結果歸檔中的文件我們將會得到:

$ python -m tarfile -l /Users/tarek/myarchive.tar
structure/content/
structure/content/please_add.txt

查詢輸出終端的尺寸

shutil.get_terminal_size(fallback=(columns,?lines))

獲取終端窗口的尺寸。

對于兩個維度中的每一個,會分別檢查環境變量?COLUMNS?和?LINES。 如果定義了這些變量并且其值為正整數,則將使用這些值。

如果未定義?COLUMNS?或?LINES,這是通常的情況,則連接到?sys.__stdout__?的終端將通過發起調用?os.get_terminal_size()?被查詢。

如果由于系統不支持查詢,或是由于我們未連接到某個終端而導致查詢終端尺寸不成功,則會使用在?fallback?形參中給出的值。?fallback?默認為?(80,?24),這是許多終端模擬器所使用的默認尺寸。

返回的值是一個?os.terminal_size?類型的具名元組。

另請參閱: The Single UNIX Specification, Version 2,?Other Environment Variables.

3.3 新版功能.

在 3.11 版更改:?如果?os.get_terminal_size()?返回零值則?fallback?值也將被使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215985.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gitlab動態流水線

文章目錄 1. 說明2. 官方樣例2.1 在作業中生成配置文件,保存為產物2.2 將觸發器作業配置為在生成配置文件的作業之后運行。 3. 實戰應用3.1 背景介紹3.2 項目介紹3.3 公共項目配置3.4 測試項目配置3.5 測試 4. 總結 1. 說明 顧名思義,動態流水線就是一種…

Shell函數數組練習

1、編寫函數,實現打印綠色OK和紅色FAILED,判斷是否有參數,存在為Ok,不存在為FAILED [rootshell ~]# vim ok.sh #!/bin/bash read -p "請輸入一個參數:" i function ok…

mac 安裝nvm以及切換node版本詳細步驟

1、nvm介紹(node版本管理工具) nvm 可以讓你通過命令行快速安裝和使用不同版本的node 有時候項目太老,node版本太高,執行npm install命令會報錯,可以借助nvm切換低版本的node。 2、安裝nvm 在終端執行安裝命令 curl -o- https://raw.gith…

后端只打印了info等級的日志?-SpringBoot日志打印-Slf4j

在調用log變量的方法來輸出日志時,有以上5個級別對應的方法,從不太重要,到非常重要 調用不同的方法,就會輸出不同級別的日志。 trace:跟蹤信息debug:調試信息info:一般信息warn:警告…

1、混合方式UI設計

1、混合方式UI設計 新建項目添加靜態資源添加資源添加action添加菜單菜單欄工具欄中間編輯區域 代碼添加其他組件字體和大小狀態欄 添加槽函數UI設置的轉到槽的手寫的設置應用程序圖標 代碼 新建項目 MainWindow代碼文件夾主窗口為 (QMainWindow) 添加靜態資源 AppIcon.icoi…

scikit-learn-feature_selection

參考: Feature selection 1. 移除低方差的特征 方差低,說明變化不大。 將特征方差值小于一定值的特征移除 單變量特征分析 通過單特征分析,選擇最好的(前k個)的特征,scikit-learn 提供的方法有&#x…

LeetCode-1475. 商品折扣后的最終價格【棧 數組 單調棧】

LeetCode-1475. 商品折扣后的最終價格【棧 數組 單調棧】 題目描述:解題思路一:暴力解法。兩層for。解題思路二:單調棧,具體思路是反向遍歷數組prices。遇到棧頂元素小于當前元素的就出棧,目的是為了找到當前位置右邊的…

基于JAVA+SpringBoot+Vue的前后端分離的旅游網站

?全網粉絲20W,csdn特邀作者、博客專家、CSDN新星計劃導師、java領域優質創作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? 🍅文末獲取項目下載方式🍅 一、項目背景介紹: 近年來,隨…

區塊鏈的可拓展性研究【01】layer1

什么是一層網絡? 一層網絡是底層區塊鏈。以太坊和比特幣都是一層網絡區塊鏈,因為它們是基石,各種二層網絡都構建于其上。二層網絡項目的示例包括以太坊上的“卷疊”和基于比特幣的閃電網絡。所有這些二層網絡項目上的用戶交易活動最終都可以回…

IntelliJ IDEA 自帶的 HTTP Client接口調用插件,替代 Postman

文章目錄 引言建議目錄結構新建請求不同環境的變量配置添加環境http-client.env.jsonhttp-client.private.env.json引用變量 請求示例Get請求示例Post請求示例鑒權示例斷言示例Websocket請求示例 內置對象和動態變量內置對象:內置變量: 引言 在日常的 W…

關于引用unpkg.com的mars3d相關依賴文件報錯無法請求的說明

問題來源: 1.關于引用unpkg.com的mars3d相關依賴文件報錯無法請求的說明 說明: 1.最近npm、unpkeg都訪問異常,可能是unpkg.com等國外的服務器不穩定導致的請求未響應。 解決方案: 1.請切換靜態文件引入的方式請求相關資源。參…

LaTex:如何在數學環境下打出大的右括號“}“

一般來說多行公式打左大括號都知道使用語法"cases" \begin{cases} foo\\ foo\\ \end{cases}最近需要鍵入右邊大花括號括起來公式的時候犯難了,搜了很多用的都是"\left.array\right}",看得我昏迷,屢屢報錯。 突然想起很久…

selenium自動化(中)

顯式等待與隱式等待 簡介 在實際工作中等待機制可以保證代碼的穩定性,保證代碼不會受網速、電腦性能等條件的約束。 等待就是當運行代碼時,如果頁面的渲染速度跟不上代碼的運行速度,就需要人為的去限制代碼執行的速度。 在做 Web 自動化時…

PS背景色替換

1.打開ps后右鍵圖層復制 2.隱藏復制的圖層,選擇魔術橡皮擦擦掉不用替換的顏色 3.選中圖層后選擇顏色疊加修改圖層顏色

機器學習-SVM(支持向量機)

推薦課程:【機器學習實戰】第5期 支持向量機 |數據分析|機器學習|算法|菊安醬_嗶哩嗶哩_bilibili 贊美菊神ヾ ( ゜ⅴ゜)ノ 一、什么是支持向量機? 支持向量機(Support Vector Machine, SVM)是一類按監督學習&#xff0…

RAID(冗余獨立磁盤陣列)介紹(一種用于存儲數據的技術,通過將數據分布在多個硬盤驅動器上,以提高數據的可靠性和性能)

文章目錄 RAID介紹什么是RAID?RAID的歷史RAID的類型RAID 0RAID 1RAID 5RAID 6 RAID的選擇和配置RAID在安裝系統時的應用結論 RAID介紹 RAID(冗余獨立磁盤陣列)是一種用于存儲數據的技術,它通過將數據分布在多個硬盤驅動器上&…

【神行百里】pandas查詢加速之行索引篇

最近進行大數據處理的時候,發現我以前常用的pandas查詢方法太慢了,太慢了,真是太慢了,查閱資料,遂發現了一種新的加速方法,能助力我飛上天,和太陽肩并肩,所以記錄下來。 1. 場景說明…

跨境獨立站優勢包括哪些?是否值得做呢?

跨境獨立站的優勢主要包括: 自主品牌建設:獨立站可以更好地展示自主品牌形象,提高品牌知名度和美譽度。 獨立域名:獨立站可以擁有自己的域名,更加穩定和可信。 自主運營:獨立站可以自主運營,包…

低版本echarts的升級到新版5.4.0的echarts瀏覽器預警和報錯信息

新版5.4.0的echarts瀏覽器預警和報錯信息 [ECharts] DEPRECATED: ‘normal’ hierarchy in itemStyle has been removed since 4.0. All style properties are configured in itemStyle directly now. 因為normal層被移除,問題代碼如下圖所示 itemStyle: {normal:…

MBR30200FCT-ASEMI大電流肖特基MBR30200FCT

編輯:ll MBR30200FCT-ASEMI大電流肖特基MBR30200FCT 型號:MBR30200FCT 品牌:ASEMI 封裝:TO-220F 最大平均正向電流:30A 最大重復峰值反向電壓:200V 產品引線數量:3 產品內部芯片個數&am…