摘要:并非所有平臺(tái)都能檢查和修改軟鏈接,能告訴用戶本地平臺(tái)可使用哪些功能。當(dāng)為且為軟鏈接時(shí),將作為軟鏈接被創(chuàng)建并拷貝的所有元數(shù)據(jù)到。原始如果存在則被直接覆蓋是軟鏈接文件,是普通文件或軟鏈接文件,移動(dòng)并重命名為,指向的真實(shí)文件為之前指向的源文件。
shutil模塊提供了一些針對(duì)文件和目錄的高級(jí)操作,主要是拷貝、移動(dòng)。對(duì)于單個(gè)文件的操作,還可參考o(jì)s模塊
Warning:即使是高級(jí)別的拷貝函數(shù)(shutil.copy(),shutil.copy2())也不能拷貝所有的文件元數(shù)據(jù)。意思是:在POSIX系統(tǒng)中,文件所有者、屬組以及ACL信息會(huì)丟失。在Windows平臺(tái)上,文件所有者,ACL以及ADS(供選數(shù)據(jù)流)不會(huì)被復(fù)制。On Mac OS, the resource fork and other metadata are not used. This means that resources will be lost and file type and creator codes will not be correct.
目錄及文件操作 shutil.copyfileobj(fsrc, fdst[, length])復(fù)制file-like對(duì)象fsrc的內(nèi)容到fdst,如果fdst不存在則自動(dòng)創(chuàng)建。length表示緩沖大小,如果是負(fù)數(shù)表示直接復(fù)制,不循環(huán)遍歷塊中的源數(shù)據(jù)。數(shù)據(jù)默認(rèn)按塊讀取(16 * 1024)避免不可控的內(nèi)存消耗。
import shutil shutil.copyfileobj(open("fsrc.txt", "rb"), open("fdst.txt", "wb"))shutil.copyfile(src, dst, *, follow_symlinks=True)
復(fù)制文件src的內(nèi)容到dst并返回dst,如果dst不存在則自動(dòng)創(chuàng)建。src和dst是字符串類型的路徑名,如果src和dst指向同一個(gè)文件,拋出SameFileError異常。
目標(biāo)位置必須是可寫的,否則將拋出OSError異常(實(shí)際拋出的是PermissionError)。如果dst已經(jīng)存在,則直接覆蓋。特殊文件比如塊設(shè)備、字符設(shè)備、管道不能使用此函數(shù)復(fù)制。
如果follow_symlinks為False且src是軟鏈接,將創(chuàng)建一個(gè)新的軟鏈接替代拷貝行為
shutil.copyfile("src.txt", "dst.txt")shutil.copymode(src, dst, *, follow_symlinks=True)
復(fù)制文件src的權(quán)限位(permission bits)到dst,src和dst是字符串類型的路徑名。如果follow_symlinks為False且src和dst都是軟鏈接,將修改dst軟鏈接文件而非源文件的權(quán)限。
此函數(shù)并非所有平臺(tái)可用,如果它不能修改本地平臺(tái)的軟鏈接但又執(zhí)行了相關(guān)操作,將不做任何操作直接返回None
# 修改前 -rw-r--r--. 1 root root 96 10月 11 12:26 aa.txt -rw-------. 1 root root 1362 9月 6 22:07 anaconda-ks.cfg -rw-------. 1 admin admin 0 10月 11 12:53 bb.txt lrwxrwxrwx. 1 root root 21 10月 11 12:58 cc.txt -> /root/anaconda-ks.cfg >>> shutil.copymode("aa.txt", "bb.txt") >>> shutil.copymode("aa.txt", "cc.txt") # 修改后 -rw-r--r--. 1 root root 96 10月 11 12:26 aa.txt -rw-r--r--. 1 root root 1362 9月 6 22:07 anaconda-ks.cfg -rw-r--r--. 1 admin admin 0 10月 11 12:53 bb.txt lrwxrwxrwx. 1 root root 21 10月 11 12:58 cc.txt -> /root/anaconda-ks.cfgshutil.copystat(src, dst, *, follow_symlinks=True)
復(fù)制src的權(quán)限位、最后訪問時(shí)間、最后修改時(shí)間以及標(biāo)志(flag)到dst,src和dst是字符串類型的路徑名,可以是文件或目錄。在Linux平臺(tái)上還會(huì)復(fù)制擴(kuò)展屬性。
如果follow_symlinks為False,且src和dst都是軟鏈接,此函數(shù)直接操作軟鏈接而非源文件(目錄)。
Note:并非所有平臺(tái)都能檢查和修改軟鏈接,python能告訴用戶本地平臺(tái)可使用哪些功能。
如果os.chmod in os.supports_follow_symlinks為True,copystat()可以修改軟鏈接的權(quán)限位
如果os.utime in os.supports_follow_symlinks為True,copystat()可以修改軟鏈接的最后訪問時(shí)間和最后修改時(shí)間
如果os.chflags in os.supports_follow_symlinks為True,copystat()可以修改軟鏈接的flag
copystat()總是能成功執(zhí)行,即使是在某些它的部分或全部功能不可用的平臺(tái)上修改軟鏈接,它將最大限度地拷貝它能拷貝的所有信息。
shutil.copy(src, dst, *, follow_symlinks=True)復(fù)制文件src的內(nèi)容和權(quán)限位到dst,dst可以是文件或目錄,如果是文件,函數(shù)的返回值就是dst,如果是目錄,函數(shù)的返回值就是src的文件名與dst的路徑拼接。src和dst都是字符串類型,如果dst指向一個(gè)目錄,則創(chuàng)建與src同名(basename)的新文件。
如果follow_symlinks為False,且src是軟鏈接,dst將作為軟鏈接創(chuàng)建;如果follow_symlinks為True,src為軟鏈接,則實(shí)際拷貝的是src指向的源文件。
copy()使用copymode()拷貝權(quán)限位,使用copyfile()拷貝文件內(nèi)容
>>> shutil.copy("src.txt", "dst.txt") "dst.txt" >>> shutil.copy("src.txt", "/tmp/") "/tmp/src.txt" >>> shutil.copy("src.txt", "/Dota2/") # 傳入一個(gè)不存在的目錄 Traceback (most recent call last): ... IsADirectoryError: [Errno 21] Is a directory: "/Dota2/"shutil.copy2(src, dst, *, follow_symlinks=True)
除了還會(huì)保留src的所有元數(shù)據(jù)(如創(chuàng)建時(shí)間、修改時(shí)間等),其他與copy()相同。
當(dāng)follow_symlinks為False且src為軟鏈接時(shí),dst將作為軟鏈接被創(chuàng)建并拷貝src的所有元數(shù)據(jù)到dst。
copy2()使用copystat()拷貝元數(shù)據(jù),使用copyfile()拷貝文件內(nèi)容
shutil.ignore_patterns(*patterns)創(chuàng)建并返回一個(gè)函數(shù),可傳遞到copytree()中作為ignore參數(shù)的值,忽略滿足匹配模式的文件和目錄
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)遞歸復(fù)制以src為根目錄的整個(gè)目錄樹,返回目標(biāo)目錄dst。dst必須是不存在的目錄,它和它不存在的父目錄都將被創(chuàng)建。使用copystat()復(fù)制目錄元數(shù)據(jù),使用copy2()復(fù)制文件內(nèi)容和元數(shù)據(jù)
symlinks:如果值為True,拷貝src目錄樹中的軟鏈接和軟鏈接的元數(shù)據(jù)到dst目錄樹;如果值為False,拷貝src目錄樹中軟鏈接指向的源文件(目錄)的內(nèi)容和元數(shù)據(jù)到dst目錄樹(需要注意的是,拷貝后的文件或目錄的名稱使用的是軟鏈接的名稱而非源文件或目錄的名稱),倘若源文件不存在將導(dǎo)致異常,異常信息保存在最終拋出的Error異常中。
ignore_dangling_symlinks:如果值為True,可以忽略symlinks參數(shù)為False時(shí)由于源文件不存在產(chǎn)生的異常。對(duì)于不支持os.symlink()的平臺(tái),此參數(shù)無任何影響
ignore:必須是一個(gè)可調(diào)用對(duì)象,接收src目錄樹下的目錄和使用os.listdir()返回的該目錄下的文件、目錄列表。由于copytree()是遞歸調(diào)用的,因此src目錄樹下每個(gè)被復(fù)制的目錄都會(huì)調(diào)用一次ignore。
copy_function:必須是一個(gè)可調(diào)用對(duì)象,用于復(fù)制文件
原始目錄結(jié)構(gòu):
[root@localhost Shutil]# pwd /root/Shutil [root@localhost Shutil]# ll -R .: 總用量 0 drwxr-xr-x. 3 root root 70 10月 12 10:48 src drwxr-xr-x. 3 root root 33 10月 12 10:47 symlink ./src: 總用量 0 -rw-r--r--. 1 root root 0 10月 12 10:39 aa.txt drwxr-xr-x. 2 root root 6 10月 12 10:40 ffffdir lrwxrwxrwx. 1 root root 27 10月 12 10:48 ssdir_link -> /root/Shutil/symlink/ssdir/ lrwxrwxrwx. 1 root root 27 10月 12 10:48 ss_link.txt -> /root/Shutil/symlink/ss.txt ./src/ffffdir: 總用量 0 ./symlink: 總用量 0 drwxr-xr-x. 2 root root 6 10月 12 10:57 ssdir -rw-r--r--. 1 root root 0 10月 12 10:46 ss.txt ./symlink/ssdir: 總用量 0
shutil.copytree("/root/Shutil/src/", "/root/Shutil/dst/", symlinks=False)的執(zhí)行結(jié)果:
[root@localhost Shutil]# ll dst/ 總用量 0 -rw-r--r--. 1 root root 0 10月 12 10:39 aa.txt drwxr-xr-x. 2 root root 6 10月 12 10:40 ffffdir drwxr-xr-x. 2 root root 6 10月 12 10:57 ssdir_link -rw-r--r--. 1 root root 0 10月 12 10:46 ss_link.txt
shutil.copytree("/root/Shutil/src/", "/root/Shutil/dst/", symlinks=True)的執(zhí)行結(jié)果:
[root@localhost Shutil]# ll dst/ 總用量 0 -rw-r--r--. 1 root root 0 10月 12 10:39 aa.txt drwxr-xr-x. 2 root root 6 10月 12 10:40 ffffdir lrwxrwxrwx. 1 root root 27 10月 12 10:48 ssdir_link -> /root/Shutil/symlink/ssdir/ lrwxrwxrwx. 1 root root 27 10月 12 10:48 ss_link.txt -> /root/Shutil/symlink/ss.txtshutil.rmtree(path, ignore_errors=False, onerror=None)
刪除目錄。path必須指代一個(gè)目錄(但不能是目錄的軟鏈接)。
ignore_errors:如果為True,忽略目錄刪除失敗導(dǎo)致的異常,否則該異常將由onerror參數(shù)指定的函數(shù)處理。如果onerror為None,該異常被拋出
onerror:必須是一個(gè)接收三個(gè)參數(shù)(function, path, excinfo)的可調(diào)用對(duì)象。
Note:在支持基于文件描述符的目錄訪問函數(shù)的平臺(tái)上,默認(rèn)使用抗軟鏈接攻擊(symlink attack resistant)的rmtree()版本;其他平臺(tái)上的rmtree()的實(shí)現(xiàn)易遭受軟鏈接攻擊。可以用rmtree.avoids_symlink_attacks查看當(dāng)前平臺(tái)的rmtree()方法能否抵抗軟鏈接攻擊
shutil.move(src, dst, copy_function=copy2)移動(dòng)文件或目錄到目標(biāo)位置。
如果目標(biāo)位置dst是一個(gè)存在的[軟鏈接]目錄,將src(文件或目錄)移動(dòng)到dst路徑下
# before [root@localhost shutil_move]# pwd /root/shutil_move [root@localhost shutil_move]# ll 總用量 0 drwxr-xr-x. 2 root root 6 10月 12 14:41 dst_dir drwxr-xr-x. 2 root root 20 10月 12 14:39 src >>> shutil.move("/root/shutil_move/src/", "/root/shutil_move/dst_dir/") "/root/shutil_move/dst_dir/src" # after [root@localhost shutil_move]# ll -R .: 總用量 0 drwxr-xr-x. 3 root root 17 10月 12 14:43 dst_dir ./dst_dir: 總用量 0 drwxr-xr-x. 2 root root 6 10月 12 14:45 src ./dst_dir/src: 總用量 0
如果目標(biāo)位置dst是一個(gè)不存在的目錄,創(chuàng)建dst及其不存在的父級(jí)目錄,將src(文件)移動(dòng)到dst路徑下或?qū)rc(目錄)移動(dòng)并重命名為dst
# before [root@localhost shutil_move]# pwd /root/shutil_move [root@localhost shutil_move]# ll 總用量 0 drwxr-xr-x. 2 root root 6 10月 12 14:55 src [root@localhost shutil_move]# ll /tmp/ 總用量 0 >>> shutil.move("/root/shutil_move/src/", "/tmp/a/b/dst/") "/tmp/a/b/dst/" # after [root@localhost shutil_move]# ll 總用量 0 [root@localhost shutil_move]# ll -R /tmp/ /tmp/: 總用量 0 drwxr-xr-x. 3 root root 15 10月 12 14:57 a /tmp/a: 總用量 0 drwxr-xr-x. 3 root root 17 10月 12 14:57 b /tmp/a/b: 總用量 0 drwxr-xr-x. 2 root root 6 10月 12 14:55 dst /tmp/a/b/dst: 總用量 0
如果dst非目錄,且dst存在或其上級(jí)目錄存在
src是普通文件,dst是普通文件或軟鏈接文件,移動(dòng)src并重命名為dst。原始dst如果存在則被直接覆蓋
src是軟鏈接文件,dst是普通文件或軟鏈接文件,移動(dòng)src并重命名為dst,指向的真實(shí)文件為src之前指向的源文件。原始dst如果存在則被直接覆蓋
shutil.disk_usage(path)以命名元組的方式(total, used, free)返回指定path的磁盤使用數(shù)據(jù),單位為byte。在Windows平臺(tái),path必須指代目錄;在Unix平臺(tái)path可以是目錄或文件
shutil.chown(path, user=None, group=None)改變指定path的所有者和屬組。
user和group參數(shù),可以是系統(tǒng)上的用戶名/組名或uid/gid。至少需要傳遞其中一個(gè)參數(shù)
shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)返回cmd調(diào)用的可執(zhí)行文件路徑,沒有返回None。
mode:傳遞給os.access()的權(quán)限掩碼(permission mask),默認(rèn)值為os.F_OK | os.X_OK,用于判斷文件是否存在或可執(zhí)行。
path:cmd的查找路徑。如果未指定,在os.environ的"PATH"key指代的路徑查找,如果"PATH"不存在,使用os.defpath作為默認(rèn)路徑。
在Windows平臺(tái),不管使用默認(rèn)path還是自定義的path,查找路徑都將包含當(dāng)前工作目錄且處于最高優(yōu)先級(jí)。此外,在查找cmd時(shí),還會(huì)檢查環(huán)境變量PATHEXT。
>>> shutil.which("python3") "D:Program FilesPython36python3.EXE"copytree示例
使用ignore_patterns()忽略拷貝后綴為.pyc的文件和tmp打頭的文件或文件夾:
from shutil import copytree, ignore_patterns copytree(source, destination, ignore=ignore_patterns("*.pyc", "tmp*"))
使用ignore參數(shù)記錄日志:
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示例
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)歸檔操作
基于zipfile和tarfile模塊提供創(chuàng)建和讀取歸檔文件的功能。
shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])創(chuàng)建歸檔文件,并返回歸檔文件的名稱。
base_name:要?jiǎng)?chuàng)建的歸檔文件的名稱(不包含擴(kuò)展名),可以包含路徑表示歸檔文件的目標(biāo)位置
format:歸檔文件的格式(zip, tar, gztar, bztar, xztar)
root_dir:歸檔文件的根目錄(默認(rèn)當(dāng)前目錄)
base_dir:歸檔文件中所有文件和目錄的前綴路徑(默認(rèn)當(dāng)前目錄)
dry_run:如果為True,不創(chuàng)建歸檔文件,但是將執(zhí)行的操作記錄在logger中
owner/group:歸檔文件中所有文件和目錄的所屬用戶和組。如果format為"zip",owner和group的配置不生效
logger:通常使用logging.Logger對(duì)象
verbose:已棄用
# /root/demo/ 歸檔該目錄下的文件和文件夾 # /tmp/shutil/ 生成的歸檔文件中的所有內(nèi)容的前綴路徑 >>> shutil.make_archive("/root/demo_zip/zipfile", "zip", "/root/demo/", "/tmp/shutil/") "/root/demo_zip/zipfile.zip"
[root@localhost demo_zip]# unzip -l zipfile.zip Archive: zipfile.zip Length Date Time Name --------- ---------- ----- ---- 0 10-15-2018 11:03 tmp/shutil/ 0 10-15-2018 11:03 tmp/shutil/aa.txt 0 10-15-2018 11:03 tmp/shutil/bb.txt 0 10-15-2018 11:03 tmp/shutil/cc.txt --------- ------- 0 4 filesshutil.get_archive_formats()
返回支持的歸檔格式列表,列表中的每個(gè)元素是(name, description)形式的元組。
默認(rèn)支持的格式如下:
zip:需要zlib模塊支持
tar
gztar:需要zlib模塊支持
bztar:需要bz2模塊支持
xztar:需要lzma模塊支持
用戶可以通過register_archive_format()注冊(cè)新的格式或者自定義已存在格式的歸檔行為
shutil.register_archive_format(name, function[, extra_args[, description]])注冊(cè)格式為name的歸檔器
shutil.unregister_archive_format(name)從支持的歸檔格式中移除name
shutil.unpack_archive(filename[, extract_dir[, format]])解壓歸檔文件。
filename:歸檔文件名稱
extract_dir:歸檔文件解壓的目標(biāo)位置。默認(rèn)使用當(dāng)前目錄
format:使用指定格式的解壓器解壓歸檔文件,默認(rèn)使用filename參數(shù)的擴(kuò)展名。如果不存在對(duì)應(yīng)的解壓器,拋出ValueError異常
shutil.register_unpack_format(name, extensions, function[, extra_args[, description]])注冊(cè)格式為name的解壓器
shutil.unregister_unpack_format(name)從支持的解壓格式中移除name
shutil.get_unpack_formats()返回支持的解壓格式列表,列表中的每個(gè)元素是(name, extensions, description)形式的元組。
查詢終端大小 shutil.get_terminal_size(fallback=(columns, lines))獲取終端窗口的大小。
如果環(huán)境變量中定義了正整數(shù)的COLUMNS和LINES,返回該大小。
如果COLUMNS和LINES未定義(多數(shù)情況都是如此),返回調(diào)用os.get_terminal_size()查詢連接到sys.__stdout__的終端的大小。
如果終端大小不能被查詢(系統(tǒng)不支持或者未連接到終端),使用fallback參數(shù)提供的大小作為后備值,默認(rèn)是(80, 24)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/44812.html
摘要:報(bào)告這錯(cuò)誤后,繼續(xù)或者拋出終止。調(diào)用方式當(dāng)前遍歷的目錄目錄下的目錄列表目錄下的文件列表在進(jìn)行文件內(nèi)指針重置的時(shí)候,除了基礎(chǔ)篇文件部分介紹的絕對(duì)定位外,通過模塊還可以實(shí)現(xiàn)相對(duì)定位。 Python的目錄操作主要依賴于os和 shutil 模塊. Python目錄操作 新建目錄 os.mkdir(./test/) #在當(dāng)前目錄下新建名為test的目錄,存在則報(bào)錯(cuò) 新建多級(jí)目錄 os.make...
摘要:對(duì)目錄的操作獲取絕對(duì)路徑合并目錄。總是將把一個(gè)路徑拆分為兩部分,后一部分總是最后級(jí)別的目錄或文件名對(duì)文件進(jìn)行操作重命名刪除文件刪除目錄時(shí),目錄必須為空刪除目錄,模塊的擴(kuò)展版。和需是文件可以是文件或者是目錄。打印出所有的目錄。 pytho的os、os.path模塊給我買提供了很多對(duì)文件或者目錄進(jìn)行操作的方法。 os.path 對(duì)目錄的操作 import os.path print os...
摘要:下面為大家分享一篇實(shí)現(xiàn)刪除某路徑下文件及文件夾的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。類似于高級(jí),而且主要強(qiáng)大之處在于其對(duì)文件的復(fù)制與刪除操作更是比較支持好。附模塊庫(kù)的使用有關(guān)文件夾與文件的查找,刪除等功能在模塊中實(shí)現(xiàn)。下面為大家分享一篇Python 實(shí)現(xiàn)刪除某路徑下文件及文件夾的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起過來看看吧Python 實(shí)現(xiàn)刪除某路徑下文件及...
摘要:下面為大家分享一篇實(shí)現(xiàn)刪除某路徑下文件及文件夾的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。類似于高級(jí),而且主要強(qiáng)大之處在于其對(duì)文件的復(fù)制與刪除操作更是比較支持好。附模塊庫(kù)的使用有關(guān)文件夾與文件的查找,刪除等功能在模塊中實(shí)現(xiàn)。下面為大家分享一篇Python 實(shí)現(xiàn)刪除某路徑下文件及文件夾的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起過來看看吧Python 實(shí)現(xiàn)刪除某路徑下文件及...
摘要:?jiǎn)卧卦孢@是整數(shù)這才是元祖也許這兩行,你們當(dāng)時(shí)疑惑過,并且現(xiàn)在也都知道了,當(dāng)然重點(diǎn)并不在這里。。雖然我水平很垃圾,但是我知道匿名函數(shù)有一種執(zhí)行方式叫做自執(zhí)行。看吧,這就是版的匿名函數(shù)自執(zhí)行方法。 單元素元祖: a = (1) # 這是整數(shù)1 a = (1,) # 這才是元祖 也許這兩行,你們當(dāng)時(shí)疑惑過,并且現(xiàn)在也都知道了,當(dāng)然重點(diǎn)并不在這里。。 我無聊的時(shí)候想過,為什么單...
閱讀 1729·2021-11-22 12:09
閱讀 1459·2019-08-30 13:22
閱讀 2092·2019-08-29 17:00
閱讀 2642·2019-08-29 16:28
閱讀 2953·2019-08-26 13:51
閱讀 1181·2019-08-26 13:25
閱讀 3243·2019-08-26 12:14
閱讀 3014·2019-08-26 12:14