python3從零學(xué)習(xí)-5.4.10、shutil — 高階文件操作

源代碼:?Lib/shutil.py

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

警告

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

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

目錄和文件操作

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

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

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

將?src?文件的內(nèi)容(不含元數(shù)據(jù))拷貝到?dst?文件并返回?dst。?src?和?dst?是字符串形式的路徑。?dst?必須是完整的目標(biāo)文件名;對(duì)于接受一個(gè)目標(biāo)目錄路徑的拷貝請(qǐng)參見(jiàn)?shutil.copy()。 如果?src?和?dst?指定了同一文件,則將引發(fā)?SameFileError。

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

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

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

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

exception?shutil.SameFileError

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

3.4 新版功能.

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

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

在 3.3 版更改:?加入?follow_symlinks?參數(shù)。

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

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

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

注解

并非所有平臺(tái)者提供檢查和修改符號(hào)鏈接的功能。 Python 本身可以告訴你哪些功能是在本機(jī)上可用的。

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

如果?os.utime?in?os.supports_follow_symlinks?為?True,則?copystat()?可以修改符號(hào)鏈接的最近訪問(wèn)和修改時(shí)間。

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

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

更多信息請(qǐng)參閱?os.supports_follow_symlinks。

在 3.3 版更改:?添加了?follow_symlinks?參數(shù)并且支持 Linux 擴(kuò)展屬性。

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

將文件?src?拷貝到文件或目錄?dst。?src?和?dst?應(yīng)為字符串。 如果?dst?指定了一個(gè)目錄,文件將使用?src?中的基準(zhǔn)文件名拷貝到?dst。 返回新創(chuàng)建文件所對(duì)應(yīng)的路徑。

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

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

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

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

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

當(dāng)?follow_symlinks?為假值且?src?為符號(hào)鏈接時(shí),copy2()?會(huì)嘗試將來(lái)自?src?符號(hào)鏈接的所有元數(shù)據(jù)拷貝到新創(chuàng)建的?dst?符號(hào)鏈接。 但是,此功能不是在所有平臺(tái)上均可用。 在此功能部分或全部不可用的平臺(tái)上,copy2()?將盡量保留所有元數(shù)據(jù);copy2()?一定不會(huì)返回失敗的結(jié)果。

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

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

shutil.ignore_patterns(*patterns)

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

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

遞歸地拷貝以?src?為根路徑的整個(gè)目錄樹(shù),返回目標(biāo)目錄。 名為?dst?的目標(biāo)目錄不必已存在;它本身和還不存在的父目錄都將被自動(dòng)創(chuàng)建。 目錄的權(quán)限和時(shí)間信息將通過(guò)?copystat()?來(lái)拷貝,單獨(dú)的文件將使用?shutil.copy2()?來(lái)拷貝。

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

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

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

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

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

在 3.3 版更改:?當(dāng)?symlinks?為假值時(shí)拷貝元數(shù)據(jù)。 現(xiàn)在會(huì)返回?dst。

在 3.2 版更改:?添加了?copy_function?參數(shù)以允許提供定制的拷貝函數(shù)。 添加了?ignore_dangling_symlinks?參數(shù)以便在?symlinks?為假值時(shí)屏蔽符號(hào)鏈接錯(cuò)誤。

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

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

注解

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

如果提供了?onerror,它必須為接受三個(gè)形參的可調(diào)用對(duì)象:?function,?path?和?excinfo。

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

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

rmtree.avoids_symlink_attacks

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

3.3 新版功能.

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

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

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

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

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

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

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

shutil.disk_usage(path)

返回給定路徑的磁盤(pán)使用統(tǒng)計(jì)數(shù)據(jù),形式為一個(gè)?named tuple,其中包含?total,?used?和?free?屬性,分別表示總計(jì)、已使用和未使用空間的字節(jié)數(shù)。 在 Windows 上,path?必須是一個(gè)目錄;在 Unix 上,它可以是一個(gè)文件或一個(gè)目錄。

3.3 新版功能.

Availability: Unix, Windows.

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

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

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

另請(qǐng)參閱下層的函數(shù)?os.chown()。

Availability: Unix.

3.3 新版功能.

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

返回當(dāng)給定的?cmd?被調(diào)用時(shí)將要運(yùn)行的可執(zhí)行文件的路徑。 如果沒(méi)有?cmd?會(huì)被調(diào)用則返回?None。

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

當(dāng)未指定?path?時(shí),將會(huì)使用?os.environ()?的結(jié)果,返回 “PATH” 的值或回退為?os.defpath。

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

>>>shutil.which("python")

'C:\\Python33\\python.EXE'

3.3 新版功能.

exception?shutil.Error

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

copytree 示例

這個(gè)示例就是上面所描述的?copytree()?函數(shù)的實(shí)現(xiàn),其中省略了文檔字符串。 它還展示了此模塊所提供的許多其他函數(shù)。

defcopytree(src, dst, symlinks=False):

??? names=os.listdir(src)

??? os.makedirs(dst)

??? errors=[]

???fornameinnames:

??????? srcname=os.path.join(src, name)

??????? dstname=os.path.join(dst, name)

???????try:

???????????ifsymlinksandos.path.islink(srcname):

??????????????? linkto=os.readlink(srcname)

??????????????? os.symlink(linkto, dstname)

???????????elifos.path.isdir(srcname):

??????????????? copytree(srcname, dstname, symlinks)

???????????else:

??????????????? copy2(srcname, dstname)

???????????# XXX What about devices, sockets etc.?

???????exceptOSErroraswhy:

??????????? errors.append((srcname, dstname,str(why)))

???????# catch the Error from the recursive copytree so that we can

???????# continue with other files

???????exceptErroraserr:

??????????? errors.extend(err.args[0])

???try:

??????? copystat(src, dst)

???exceptOSErroraswhy:

???????# can't copy file access times on Windows

???????ifwhy.winerrorisNone:

??????????? errors.extend((src, dst,str(why)))

???iferrors:

???????raiseError(errors)

另一個(gè)使用?ignore_patterns()?輔助函數(shù)的例子:

fromshutilimportcopytree, ignore_patterns

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

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

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

fromshutilimportcopytree

importlogging

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ù),其中部分文件設(shè)置了只讀屬性位。 它會(huì)使用 onerror 回調(diào)函數(shù)來(lái)清除只讀屬性位并再次嘗試刪除。 任何后續(xù)的失敗都將被傳播。

importos,stat

importshutil

defremove_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 版更改:?添加了對(duì)?xztar?格式的支持。

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

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?是要?jiǎng)?chuàng)建的文件名稱(chēng),包括路徑,去除任何特定格式的擴(kuò)展名。?format?是歸檔格式:為 “zip” (如果?zlib?模塊可用), “tar”, “gztar” (如果?zlib?模塊可用), “bztar” (如果?bz2?模塊可用) 或 “xztar” (如果?lzma?模塊可用) 中的一個(gè)。

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

base_dir?是我們要執(zhí)行歸檔的起始目錄;也就是說(shuō)?base_dir?將成為歸檔文件中所有文件和目錄共有的路徑前綴。

root_dir?和?base_dir?默認(rèn)均為當(dāng)前目錄。

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

owner?和?group?將在創(chuàng)建 tar 歸檔文件時(shí)被使用。 默認(rèn)會(huì)使用當(dāng)前的所有者和分組。

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

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

shutil.get_archive_formats()

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

默認(rèn)情況下?shutil?提供以下格式:

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

tar: 未壓縮的 tar 文件。

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

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

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

你可以通過(guò)使用?register_archive_format()?注冊(cè)新的格式或?yàn)槿魏维F(xiàn)有格式提供你自己的歸檔程序。

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

為?name?格式注冊(cè)一個(gè)歸檔程序。

function?是將被用來(lái)解包歸檔文件的可調(diào)用對(duì)象。 該可調(diào)用對(duì)象將接收要?jiǎng)?chuàng)建文件的?base_name,再加上要?dú)w檔內(nèi)容的?base_dir?(其默認(rèn)值為?os.curdir)。 更多參數(shù)會(huì)被作為關(guān)鍵字參數(shù)傳入:?owner,?group,?dry_run?和?logger?(與向?make_archive()?傳入的參數(shù)一致)。

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

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

shutil.unregister_archive_format(name)

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

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

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

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

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

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

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

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

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

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

shutil.unregister_unpack_format(name)

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

shutil.get_unpack_formats()

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

默認(rèn)情況下?shutil?提供以下格式:

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

tar: 未壓縮的 tar 文件。

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

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

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

你可以通過(guò)使用?register_unpack_format()?注冊(cè)新的格式或?yàn)槿魏维F(xiàn)有格式提供你自己的解包器。

歸檔程序示例

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

>>>fromshutilimportmake_archive

>>>importos

>>>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'

結(jié)果歸檔文件中包含有:

$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

查詢輸出終端的尺寸

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

獲取終端窗口的尺寸。

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

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

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

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

另請(qǐng)參閱: The Single UNIX Specification, Version 2,?Other Environment Variables.

3.3 新版功能.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容