shutil 可以看作 sh + util,即 shell 工具之意,該模塊提供了一些針對文件和文件夾的高級操作,如:拷貝、刪除、移動等,shutil 模塊是對 os 模塊的補充。
1 文件和文件夾操作
1)copyfileobj(fsrc, fdst, length=16*1024)
複製對象 fsrc 的內容到 fdst,如果 fdst 不存在則自動創建,length 表示緩衝大小,如果是負數表示直接複製,默認爲值爲 16*1024。示例如下:
s = open('folder1/fsrc.txt','r')
d = open('folder1/fdst.txt','w')
shutil.copyfileobj(s,d,16*1024)
2)shutil.copyfile(src, dst, *, follow_symlinks=True)
複製文件 src 的內容到 dst 並返回 dst,如果 dst 不存在則自動創建,src 和 dst 是字符串類型的路徑名,如果 src 和 dst 指向同一個文件,拋出 SameFileError。示例如下:
shutil.copyfile('folder1/fsrc.txt','folder1/fdst.txt')
3)copymode(src, dst, *, follow_symlinks=True)
複製文件 src 的權限到 dst,src 和 dst 是字符串類型的路徑名,如果 follow_symlinks 爲 False 且 src 和 dst 都是符號鏈接,將修改 dst 符號鏈接文件而非源文件的權限。示例如下:
shutil.copymode('folder1/fsrc.txt','folder1/fdst.txt')
符號鏈接(軟鏈接)是一類特殊的文件, 其包含有一條以絕對路徑或者相對路徑的形式指向其它文件或者目錄的引用。
4)copystat(src, dst, *, follow_symlinks=True)
複製 src 的權限、最後訪問時間、最後修改時間以及標誌到 dst,src 和 dst 是字符串類型的路徑名,可以是文件或目錄,在Linux平臺上還會複製擴展屬性。示例如下:
shutil.copystat('folder1/fsrc.txt','folder1/fdst.txt')
擴展文件屬性是文件系統的一個功能,它允許用戶將計算機文件與未被文件系統所解釋的元數據關聯起來。
5)copy(src, dst, *, follow_symlinks=True)
複製文件 src 的內容和權限到 dst,dst 可以是文件或文件夾,如果是文件,函數的返回值就是 dst,如果是文件夾,函數的返回值就是 src 的文件名與 dst 的路徑拼接,src 和 dst 都是字符串類型,如果 dst 指向一個文件夾,則創建與 src 同名的新文件。示例如下:
# dst 爲文件
shutil.copy('folder1/fsrc.txt','folder1/fdst.txt')
# dst 爲文件夾
shutil.copy('folder1/fsrc.txt', 'tmp/')
6)copy2(src, dst, *, follow_symlinks=True)
該方法會保留 src 的所有元數據(如創建時間、修改時間等),其他與 copy() 相同,當 follow_symlinks 爲 False 且 src 爲軟鏈接時,dst 將作爲軟鏈接被創建並拷貝 src 的所有元數據到 dst。示例如下:
shutil.copy2('folder1/fsrc.txt','folder1/fdst.txt')
7)ignore_patterns(*patterns)
創建並返回一個函數,可傳遞到 copytree() 中作爲 ignore 參數的值,忽略滿足匹配模式的文件和目錄。示例如下:
shutil.ignore_patterns('tmp*')
8)copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
遞歸複製以 src 爲根目錄的整個目錄樹,返回目標目錄 dst,dst 必須是不存在的目錄,它和它不存在的父目錄都將被創建,使用 copystat() 複製目錄元數據,使用 copy2() 複製文件內容和元數據。
-
symlinks:是否複製軟鏈接;
-
ignore:指定不參與複製的文件,其值應該是一個 ignore_patterns() 方法;
-
copy_function:指定複製的模式。
示例如下:
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns( 'tmp*'))
9)rmtree(path, ignore_errors=False, οnerrοr=None)
刪除目錄,path 必須指定一個目錄。示例如下:
shutil.rmtree('rm')
10)move(src, dst, copy_function=copy2)
移動文件或目錄到目標位置,如果目標位置 dst 是一個存在的目錄,將 src 移動到 dst 路徑下。示例如下:
shutil.move('folder1/', 'folder2/')
11)disk_usage(path)
檢測磁盤使用信息,返回值爲元組。示例如下:
print(shutil.disk_usage('folder1/'))
# 輸出結果
# usage(total=107375226880, used=69274427392, free=38100799488)
12)which(cmd, mode=os.F_OK | os.X_OK, path=None)
返回 cmd 調用的可執行文件路徑,沒有返回 None。mode:用於判斷文件是否存在或可執行,path:cmd 的查找路徑。示例如下:
print(shutil.which('python'))
# 輸出結果
# E:\Python3\python.EXE
13)chown(path, user=None, group=None)
改變指定 path 的所有者和所屬組,user 和 group 參數,可以是系統上的用戶名、組名或 uid/gid,至少需要傳遞其中一個參數。
2 歸檔操作
1)make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None)
創建歸檔文件,並返回歸檔文件的名稱。
-
base_name:要創建的歸檔文件的名稱,可以包含路徑表示歸檔文件的目標位置;
-
format:歸檔文件的格式(zip、tar、 gztar、bztar、xztar);
-
root_dir:歸檔文件的根目錄(默認當前目錄);
-
base_dir:歸檔文件中所有文件和目錄的前綴路徑(默認當前目錄);
-
dry_run:如果爲 True,不創建歸檔文件。
-
owner/group:歸檔文件中所有文件和目錄的所屬用戶和組,如果 format 爲 zip,owner 和 group 的配置不生效;
-
logger:通常使用 logging.Logger 對象;
-
verbose:已棄用。
看下示例:
# zipfile:生成文件名;歸檔 tmp 目錄下文件和文件夾
shutil.make_archive('zipfile', 'zip', 'tmp')
2)get_archive_formats()
返回支持的歸檔格式列表,列表中的每個元素是 (name, description) 形式的元組。示例如下:
print(shutil.get_archive_formats())
# 輸出結果
# [('bztar', "bzip2'ed tar-file"), ('gztar', "gzip'ed tar-file"), ('tar', 'uncompressed tar file'), ('xztar', "xz'ed tar-file"), ('zip', 'ZIP file')]
3)register_archive_format(name, function, extra_args=None, description='')
註冊一個格式名並綁定到一個壓縮時使用的程序,function 是用於解包存檔文件的可調用函數。
4)unregister_archive_format(name)
從支持的歸檔格式中移除 name。
5)unpack_archive(filename, extract_dir=None, format=None)
解壓歸檔文件。filename:歸檔文件名稱;extract_dir:歸檔文件解壓的目標位置;format:使用指定格式的解壓器解壓歸檔文件。
6)register_unpack_format(name, extensions, function, extra_args=None, description='')
註冊格式爲 name 的解壓器。
7)unregister_unpack_format(name)
從支持的解壓格式中移除 name。
8)get_unpack_formats()
返回支持的解壓格式列表,列表中的每個元素是 (name, extensions, description) 形式的元組。
3 查詢終端大小
get_terminal_size()
查詢終端大小。示例如下:
print(shutil.get_terminal_size())
# 輸出結果
# os.terminal_size(columns=80, lines=24)