shutil --- 高階文件操作?

源代碼: Lib/shutil.py


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

警告

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

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

目錄和文件操作?

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

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

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

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

dst 必須是完整的目標文件名;對于接受目標目錄路徑的拷貝請參見(jiàn) copy()。 如果 srcdst 指定了同一個(gè)文件,則將引發(fā) SameFileError。

目標位置必須是可寫(xiě)的;否則將引發(fā) OSError 異常。 如果 dst 已經(jīng)存在,它將被替換。 特殊文件如字符或塊設備以及管道無(wú)法用此函數來(lái)拷貝。

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

引發(fā)一個(gè) 審計事件 shutil.copyfile 附帶參數 src, dst。

在 3.3 版更改: 曾經(jīng)是引發(fā) IOError 而不是 OSError。 增加了 follow_symlinks 參數。 現在是返回 dst。

在 3.4 版更改: 引發(fā) SameFileError 而不是 Error。 由于前者是后者的子類(lèi),此改變是向后兼容的。

在 3.8 版更改: 可能會(huì )在內部使用平臺專(zhuān)屬的快速拷貝系統調用以更高效地拷貝文件。 參見(jiàn) 依賴(lài)于具體平臺的高效拷貝操作 一節。

exception shutil.SameFileError?

此異常會(huì )在 copyfile() 中的源和目標為同一文件時(shí)被引發(fā)。

3.4 新版功能.

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

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

引發(fā)一個(gè) 審計事件 shutil.copymode 附帶參數 src, dst。

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

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

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

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

備注

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

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

  • 如果 os.utime in os.supports_follow_symlinksTrue,則 copystat() 可以修改符號鏈接的最近訪(fǎng)問(wèn)和修改時(shí)間。

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

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

更多信息請參閱 os.supports_follow_symlinks。

引發(fā)一個(gè) 審計事件 shutil.copystat 附帶參數 src, dst。

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

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

Copies the file src to the file or directory dst. src and dst should be path-like objects or strings. If dst specifies a directory, the file will be copied into dst using the base filename from src. If dst specifies a file that already exists, it will be replaced. Returns the path to the newly created file.

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

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

引發(fā)一個(gè) 審計事件 shutil.copyfile 附帶參數 src, dst。

引發(fā)一個(gè) 審計事件 shutil.copymode 附帶參數 src, dst。

在 3.3 版更改: 添加了 follow_symlinks 參數。 現在會(huì )返回新創(chuàng )建文件的路徑。

在 3.8 版更改: 可能會(huì )在內部使用平臺專(zhuān)屬的快速拷貝系統調用以更高效地拷貝文件。 參見(jiàn) 依賴(lài)于具體平臺的高效拷貝操作 一節。

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

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

follow_symlinks 為假值且 src 為符號鏈接時(shí),copy2() 會(huì )嘗試將來(lái)自 src 符號鏈接的所有元數據拷貝到新創(chuàng )建的 dst 符號鏈接。 但是,此功能不是在所有平臺上均可用。 在此功能部分或全部不可用的平臺上,copy2() 將盡量保留所有元數據;copy2() 一定不會(huì )由于無(wú)法保留文件元數據而引發(fā)異常。

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

引發(fā)一個(gè) 審計事件 shutil.copyfile 附帶參數 src, dst。

引發(fā)一個(gè) 審計事件 shutil.copystat 附帶參數 src, dst。

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

在 3.8 版更改: 可能會(huì )在內部使用平臺專(zhuān)屬的快速拷貝系統調用以更高效地拷貝文件。 參見(jiàn) 依賴(lài)于具體平臺的高效拷貝操作 一節。

shutil.ignore_patterns(*patterns)?

這個(gè)工廠(chǎng)函數會(huì )創(chuàng )建一個(gè)函數,它可被用作 copytree()ignore 可調用對象參數,以忽略那些匹配所提供的 glob 風(fēng)格的 patterns 之一的文件和目錄。 參見(jiàn)以下示例。

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

Recursively copy an entire directory tree rooted at src to a directory named dst and return the destination directory. All intermediate directories needed to contain dst will also be created by default.

目錄的權限和時(shí)間會(huì )通過(guò) copystat() 來(lái)拷貝,單個(gè)文件則會(huì )使用 copy2() 來(lái)拷貝。

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

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

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

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

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

If dirs_exist_ok is false (the default) and dst already exists, a FileExistsError is raised. If dirs_exist_ok is true, the copying operation will continue if it encounters existing directories, and files within the dst tree will be overwritten by corresponding files from the src tree.

引發(fā)一個(gè) 審計事件 shutil.copytree 附帶參數 src, dst。

在 3.3 版更改: symlinks 為假值時(shí)拷貝元數據。 現在會(huì )返回 dst。

在 3.2 版更改: Added the copy_function argument to be able to provide a custom copy function. Added the ignore_dangling_symlinks argument to silence dangling symlinks errors when symlinks is false.

在 3.8 版更改: 可能會(huì )在內部使用平臺專(zhuān)屬的快速拷貝系統調用以更高效地拷貝文件。 參見(jiàn) 依賴(lài)于具體平臺的高效拷貝操作 一節。

3.8 新版功能: dirs_exist_ok 形參。

shutil.rmtree(path, ignore_errors=False, onerror=None, *, dir_fd=None)?

刪除一個(gè)完整的目錄樹(shù);path 必須指向一個(gè)目錄(但不能是一個(gè)目錄的符號鏈接)。 如果 ignore_errors 為真值,刪除失敗導致的錯誤將被忽略;如果為假值或是省略,此類(lèi)錯誤將通過(guò)調用由 onerror 所指定的處理程序來(lái)處理,或者如果此參數被省略則將引發(fā)一個(gè)異常。

This function can support paths relative to directory descriptors.

備注

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

如果提供了 onerror,它必須為接受三個(gè)形參的可調用對象: function, pathexcinfo。

第一個(gè)形參 function 是引發(fā)異常的函數;它依賴(lài)于具體的平臺和實(shí)現。 第二個(gè)形參 path 將是傳遞給 function 的路徑名。 第三個(gè)形參 excinfo 將是由 sys.exc_info() 所返回的異常信息。 由 onerror 所引發(fā)的異常將不會(huì )被捕獲。

Raises an auditing event shutil.rmtree with arguments path, dir_fd.

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

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

在 3.11 版更改: The dir_fd parameter.

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

3.3 新版功能.

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

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

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

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

如果給出了 copy_function,則它必須為接受兩個(gè)參數 srcdst 的可調用對象,并將在 os.rename() 無(wú)法使用時(shí)被用來(lái)將 src 拷貝到 dst。 如果源是一個(gè)目錄,則會(huì )調用 copytree(),并向它傳入 copy_function()。 默認的 copy_functioncopy2()。 使用 copy() 作為 copy_function 允許在無(wú)法附帶拷貝元數據時(shí)讓移動(dòng)操作成功執行,但其代價(jià)是不拷貝任何元數據。

引發(fā)一個(gè) 審計事件 shutil.move 附帶參數 src, dst。

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

在 3.5 版更改: 增加了 copy_function 關(guān)鍵字參數。

在 3.8 版更改: 可能會(huì )在內部使用平臺專(zhuān)屬的快速拷貝系統調用以更高效地拷貝文件。 參見(jiàn) 依賴(lài)于具體平臺的高效拷貝操作 一節。

在 3.9 版更改: 接受一個(gè) path-like object 作為 srcdst。

shutil.disk_usage(path)?

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

3.3 新版功能.

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

可用性: Unix, Windows。

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

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

user 可以是一個(gè)系統用戶(hù)名或 uid;group 同樣如此。 要求至少有一個(gè)參數。

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

引發(fā)一個(gè) 審計事件 shutil.chown 附帶參數 path, user, group。

可用性: Unix。

3.3 新版功能.

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

返回當給定的 cmd 被調用時(shí)將要運行的可執行文件的路徑。 如果沒(méi)有 cmd 會(huì )被調用則返回 None。

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

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

在 Windows 上當前目錄總是會(huì )被添加為 path 的第一項,無(wú)論你是否使用默認值或提供你自己的路徑,這是命令行終端在查找可執行文件時(shí)所采用的行為方式。 此外,當在 path 中查找 cmd 時(shí),還會(huì )檢查 PATHEXT 環(huán)境變量。 例如,如果你調用 shutil.which("python"),which() 將搜索 PATHEXT 來(lái)確定它要在 path 目錄中查找 python.exe。 例如,在 Windows 上:

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

3.3 新版功能.

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

exception shutil.Error?

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

依賴(lài)于具體平臺的高效拷貝操作?

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

在 macOS 上將會(huì )使用 fcopyfile 來(lái)拷貝文件內容(不含元數據)。

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

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

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

在 3.8 版更改.

copytree 示例?

An example that uses the ignore_patterns() helper:

from shutil import copytree, ignore_patterns

copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))

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

另一個(gè)使用 ignore 參數來(lái)添加記錄調用的例子:

from shutil import copytree
import logging

def _logpath(path, names):
    logging.info('Working in %s', path)
    return []   # nothing will be ignored

copytree(source, destination, ignore=_logpath)

rmtree 示例?

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

import os, stat
import shutil

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onerror=remove_readonly)

歸檔操作?

3.2 新版功能.

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

本模塊也提供了用于創(chuàng )建和讀取壓縮和歸檔文件的高層級工具。 它們依賴(lài)于 zipfiletarfile 模塊。

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

創(chuàng )建一個(gè)歸檔文件(例如 zip 或 tar)并返回其名稱(chēng)。

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

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

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

root_dirbase_dir 默認均為當前目錄。

如果 dry_run 為真值,則不會(huì )創(chuàng )建歸檔文件,但將要被執行的操作會(huì )被記錄到 logger。

ownergroup 將在創(chuàng )建 tar 歸檔文件時(shí)被使用。 默認會(huì )使用當前的所有者和分組。

logger 必須是一個(gè)兼容 PEP 282 的對象,通常為 logging.Logger 的實(shí)例。

verbose 參數已不再使用并進(jìn)入棄用狀態(tài)。

引發(fā)一個(gè) 審計事件 shutil.make_archive 并附帶參數 base_name, format, root_dir, base_dir。

備注

這個(gè)函數不是線(xiàn)程安全的。

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

shutil.get_archive_formats()?

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

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

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

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

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

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

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

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

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

name 格式注冊一個(gè)歸檔器。

function 是將被用來(lái)解包歸檔文件的可調用對象。 該可調用對象將接收要創(chuàng )建文件的 base_name,再加上要歸檔內容的 base_dir (其默認值為 os.curdir)。 更多參數會(huì )被作為關(guān)鍵字參數傳入: owner, group, dry_runlogger (與向 make_archive() 傳入的參數一致)。

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

descriptionget_archive_formats() 使用,它將返回歸檔器的列表。 默認值為一個(gè)空字符串。

shutil.unregister_archive_format(name)?

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

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

解包一個(gè)歸檔文件。 filename 是歸檔文件的完整路徑。

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

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

引發(fā)一個(gè) 審計事件 shutil.unpack_archive 附帶參數 filename, extract_dir, format。

警告

Never extract archives from untrusted sources without prior inspection. It is possible that files are created outside of the path specified in the extract_dir argument, e.g. members that have absolute filenames starting with "/" or filenames with two dots "..".

在 3.7 版更改: 接受一個(gè) path-like object 作為 filenameextract_dir。

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

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

function 是將被用來(lái)解包歸檔文件的可調用對象。 該可調用對象將接受歸檔文件的路徑,加上該歸檔文件要被解包的目標目錄。

如果提供了 extra_args,則其應為一個(gè) (name, value) 元組的序列,將被作為關(guān)鍵字參數傳遞給該可調用對象。

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

shutil.unregister_unpack_format(name)?

撤銷(xiāo)注冊一個(gè)解包格式。 name 為格式的名稱(chēng)。

shutil.get_unpack_formats()?

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

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

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

  • tar: 未壓縮的 tar 文件。

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

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

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

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

歸檔程序示例?

在這個(gè)示例中,我們創(chuàng )建了一個(gè) gzip 壓縮的 tar 歸檔文件,其中包含用戶(hù)的 .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 的歸檔程序示例?

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

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

在最終的歸檔中,應當會(huì )包括 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'

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

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

查詢(xún)輸出終端的尺寸?

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

獲取終端窗口的尺寸。

對于兩個(gè)維度中的每一個(gè),會(huì )分別檢查環(huán)境變量 COLUMNSLINES。 如果定義了這些變量并且其值為正整數,則將使用這些值。

如果未定義 COLUMNSLINES,這是通常的情況,則連接到 sys.__stdout__ 的終端將通過(guò)發(fā)起調用 os.get_terminal_size() 被查詢(xún)。

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

返回的值是一個(gè) os.terminal_size 類(lèi)型的具名元組。

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

3.3 新版功能.

在 3.11 版更改: The fallback values are also used if os.get_terminal_size() returns zeroes.