一.shutil模塊介紹
shutil模塊提供了一系列對(duì)文件和文件集合的高階操作。 特別是提供了一些支持文件拷貝和刪除的函數(shù)。 對(duì)于單個(gè)文件的操作可以參考o(jì)s模塊。
1.1 目錄和文件操作
| 操作命令 | 操作命令解釋 |
|---|---|
| shutil.copyfileobj(fsrc, fdst[, length]) | 將文件類對(duì)象 fsrc 的內(nè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)參見 shutil.copy()。 如果 src 和 dst 指定了同一文件,則將引發(fā) SameFileError。 |
| exception shutil.SameFileError | 此異常會(huì)在 copyfile() 中的源和目標(biāo)為同一文件時(shí)被引發(fā)。 |
| 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)鏈接,而它被要求這樣做,它將不做任何操作即返回。 |
| shutil.copystat(src, dst, *, follow_symlinks=True) | 從 src 拷貝權(quán)限位、最近訪問時(shí)間、最近修改時(shí)間以及旗標(biāo)到 dst。 在 Linux 上,copystat() 還會(huì)在可能的情況下拷貝“擴(kuò)展屬性”。 文件內(nèi)容、所有者和分組將不受影響。 src 和 dst 均為字符串形式的路徑名。 |
| shutil.copy(src, dst, *, follow_symlinks=True) | 將文件 src 拷貝到文件或目錄 dst。 src 和 dst 應(yīng)為字符串。 如果 dst 指定了一個(gè)目錄,文件將使用 src 中的基準(zhǔn)文件名拷貝到 dst。 返回新創(chuàng)建文件所對(duì)應(yīng)的路徑。 |
| shutil.copy2(src, dst, *, follow_symlinks=True) | 類似于 copy(),區(qū)別在于 copy2() 還會(huì)嘗試保留文件的元數(shù)據(jù) |
| shutil.ignore_patterns(*patterns) | 這個(gè)工廠函數(shù)會(huì)創(chuàng)建一個(gè)函數(shù),它可被用作 copytree() 的 ignore 可調(diào)用對(duì)象參數(shù),以忽略那些匹配所提供的 glob 風(fēng)格的 patterns 之一的文件和目錄。 參見以下示例。 |
| shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False) | 遞歸地拷貝以 src 為根路徑的整個(gè)目錄樹,返回目標(biāo)目錄。 名為 dst 的目標(biāo)目錄不必已存在;它本身和還不存在的父目錄都將被自動(dòng)創(chuàng)建。 目錄的權(quán)限和時(shí)間信息將通過(guò) copystat() 來(lái)拷貝,單獨(dú)的文件將使用 shutil.copy2() 來(lái)拷貝。 |
| shutil.rmtree(path, ignore_errors=False, onerror=None) | 刪除一個(gè)完整的目錄樹;path 必須指向一個(gè)目錄(但不能是一個(gè)目錄的符號(hào)鏈接)。 如果 ignore_errors 為真值,刪除失敗導(dǎo)致的錯(cuò)誤將被忽略;如果為假值或是省略,此類錯(cuò)誤將通過(guò)調(diào)用由 onerror 所指定的處理程序來(lái)處理,或者如果此參數(shù)被省略則將引發(fā)一個(gè)異常。 |
| shutil.move(src, dst, copy_function=copy2) | 遞歸地將一個(gè)文件或目錄 (src) 移至另一位置 (dst) 并返回目標(biāo)位置。 |
| shutil.disk_usage(path) | 返回給定路徑的磁盤使用統(tǒng)計(jì)數(shù)據(jù),形式為一個(gè) named tuple,其中包含 total, used 和 free 屬性,分別表示總計(jì)、已使用和未使用空間的字節(jié)數(shù)。 在 Windows 上,path 必須是一個(gè)目錄;在 Unix 上,它可以是一個(gè)文件或一個(gè)目錄。 |
| shutil.chown(path, user=None, group=None) | 修改給定 path 的所有者 user 和/或 group |
| shutil.which(cmd, mode=os.F_OK or os.X_OK, path=None) | 返回當(dāng)給定的 cmd 被調(diào)用時(shí)將要運(yùn)行的可執(zhí)行文件的路徑。 如果沒有 cmd 會(huì)被調(diào)用則返回 None |
| exception shutil.Error | 此異常會(huì)收集在多文件操作期間所引發(fā)的異常。 對(duì)于 copytree(),此異常參數(shù)將是一個(gè)由三元組 (srcname, dstname, exception) 構(gòu)成的列表。 |
1.2 歸檔操作
| 操作命令 | 操作命令解釋 |
|---|---|
| shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) | 創(chuàng)建一個(gè)歸檔文件(例如 zip 或 tar)并返回其名稱 |
| shutil.get_archive_formats() | 返回支持的歸檔格式列表。 所返回序列中的每個(gè)元素為一個(gè)元組 (name, description) |
| shutil.register_archive_format(name, function[, extra_args[, description]]) | 為 name 格式注冊(cè)一個(gè)歸檔程序 |
| shutil.unregister_archive_format(name) | 從支持的格式中移除歸檔格式 name |
| shutil.unpack_archive(filename[, extract_dir[, format]]) | 解包一個(gè)歸檔文件。 filename 是歸檔文件的完整路徑。 |
| shutil.register_unpack_format(name, extensions, function[, extra_args[, description]]) | 注冊(cè)一個(gè)解包格式。 name 為格式名稱而 extensions 為對(duì)應(yīng)于該格式的擴(kuò)展名列表,例如 Zip 文件的擴(kuò)展名為 .zip。 |
| shutil.unregister_unpack_format(name) | 撤銷注冊(cè)一個(gè)解包格式。 name 為格式的名稱。 |
| shutil.get_unpack_formats() | 返回所有已注冊(cè)的解包格式列表。 所返回序列中的每個(gè)元素為一個(gè)元組 (name, extensions, description)。 |
二.shutil模塊實(shí)例
2.1 shutil.copyfileobj
shutil.copyfileobj(文件1,文件2):將文件1的數(shù)據(jù)覆蓋copy給文件2。
代碼:
import shutil
f1 = open("1.txt",encoding="utf-8")
f2 = open("2.txt","w",encoding="utf-8")
shutil.copyfileobj(f1,f2)
2.2 shutil.copyfile
shutil.copyfile(文件1,文件2):不用打開文件,直接用文件名進(jìn)行覆蓋copy。
代碼:
import shutil
shutil.copyfile("1.txt","3.txt")
2.3 shutil.copymode
shutil.copymode(文件1,文件2):只拷貝權(quán)限,內(nèi)容組,用戶,均不變。
def copymode(src,dst):
"""copy mode bits from src to dst"""
if hasattr(os,'chmod'):
st = os.stat(stc)
mode = stat.S_IMODE(st.st_mode)
os.chmod(dst,mode)
2.4 shutil.copystat
shutil.copystat(文件1,文件):只拷貝了權(quán)限。
2.5 shutil.copy
shutil.copy(文件1,文件2):拷貝文件和權(quán)限都進(jìn)行copy。
2.6 shutil.copy2
shutil.copy2(文件1,文件2):拷貝了文件和狀態(tài)信息。
2.7 shutil.copytree
shutil.copytree(源目錄,目標(biāo)目錄):可以遞歸copy多個(gè)目錄到指定目錄下。
2.8 shutil.rmtree
shutil.rmtree(目標(biāo)目錄):可以遞歸刪除目錄下的目錄及文件。
2.9 shutil.move
shutil.move(源文件,指定路徑):遞歸移動(dòng)一個(gè)文件。
2.10 shutil.make_archive()
shutil.make_archive():可以壓縮,打包文件。
代碼:
import shutil
shutil.make_archive("shutil_archive_test","zip","E:\python\learn_python1\shutil")
測(cè)試結(jié)果:

2.11 shutil.disk_usage(path)
shutil.disk_usage(path) 返回給定路徑的磁盤使用統(tǒng)計(jì)數(shù)據(jù),形式為一個(gè) named tuple,其中包含 total, used 和 free 屬性,分別表示總計(jì)、已使用和未使用空間的字節(jié)數(shù)。 在 Windows 上,path 必須是一個(gè)目錄;在 Unix 上,它可以是一個(gè)文件或一個(gè)目錄。
代碼:
import shutil
BytesPerGB = 1024 * 1024 * 1024
(total, used, free) = shutil.disk_usage("E:\python\learn_python1\shutil")
print ("Total: %.2fGB" % (float(total)/BytesPerGB))
print ("Used: %.2fGB" % (float(used)/BytesPerGB))
測(cè)試記錄:
E:\python\learn_python1\venv\Scripts\python.exe E:/python/learn_python1/shutil/shutil_test3.py
Total: 465.76GB
Used: 409.95GB
Total: 465.76GB
Used: 409.95GB
Process finished with exit code 0