欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python利用shutil實(shí)現(xiàn)拷貝文件功能

 更新時(shí)間:2022年07月22日 11:21:06   作者:古明地覺  
shutil?是一個(gè)?Python?內(nèi)置模塊,該模塊對文件的復(fù)制、刪除和壓縮等操作都提供了非常方便的支持。本文將利用shutil實(shí)現(xiàn)拷貝文件功能,需要的可以參考一下

楔子

shutil 是一個(gè) Python 內(nèi)置模塊,該模塊對文件的復(fù)制、刪除和壓縮等操作都提供了非常方便的支持。

下面來詳細(xì)介紹一下該模塊的用法。

chown:更改指定路徑的所有者用戶(組)

函數(shù)原型:

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

參數(shù)含義如下:

  • path:指定要操作的路徑;
  • user:指定所有者,可以是系統(tǒng)用戶名或者 UID,如果用戶不存在則報(bào)錯(cuò) "沒有此用戶";
  • group:表示組

該方法只適用于 Unix 系統(tǒng),下面演示一下。

>>>?import?shutil
>>>?import?pwd  # Unix
>>>?import?os
>>>?
>>>?uid?=?os.stat("/home/lighthouse").st_uid
>>>?pwd.getpwuid(uid)
pwd.struct_passwd(pw_name='lighthouse',?
??????????????????pw_passwd='x',?
??????????????????pw_uid=1000,?
??????????????????pw_gid=1000,?
??????????????????pw_gecos='',?
??????????????????pw_dir='/home/lighthouse',?
??????????????????pw_shell='/bin/bash')

#?將所有者改成?root
>>>?shutil.chown("/home/lighthouse",?user="root")
#?再次查看,發(fā)現(xiàn)所有者已經(jīng)被修改了
>>>?uid?=?os.stat("/home/lighthouse").st_uid
>>>?pwd.getpwuid(uid)
pwd.struct_passwd(pw_name='root',?
??????????????????pw_passwd='x',?
??????????????????pw_uid=0,?
??????????????????pw_gid=0,?
??????????????????pw_gecos='root',?
??????????????????pw_dir='/root',?
??????????????????pw_shell='/bin/bash')

copy:復(fù)制文件

copy 函數(shù)可以將一個(gè)文件復(fù)制為另一個(gè)文件。

函數(shù)原型:

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

參數(shù)含義如下:

  • src:文件的路徑,注意:必須是文件,如果是目錄則報(bào)出權(quán)限錯(cuò)誤;
  • dst:文件或目錄的路徑,如果是一個(gè)已經(jīng)存在的目錄,那么會(huì)將 src 拷貝到該目錄中;否則會(huì)創(chuàng)建相應(yīng)的文件;
  • follow_symlinks:表示是否遵循符號(hào)鏈接,默認(rèn)為 True。如果為 True 則復(fù)制文件,為 False、并且 src 為軟連接,則創(chuàng)建一個(gè)新的軟連接;

該函數(shù)會(huì)返回目標(biāo)路徑,即新創(chuàng)建的文件的路徑。

import?shutil

shutil.copy("1.txt",?"test")

如果 test 存在并且是目錄,那么將 1.txt 拷貝到 test 目錄中;如果 test 不存在,那么創(chuàng)建一個(gè)名為 test 的文件,內(nèi)容和 1.txt 一致;如果 test 存在并且不是目錄,那么會(huì)把已存在的 test 文件覆蓋掉,此時(shí)需要具備對 test 的寫權(quán)限,否則會(huì)報(bào)出權(quán)限錯(cuò)誤:PermissionError。

另外使用 copy 復(fù)制文件時(shí),文件的元信息(創(chuàng)建時(shí)間、修改時(shí)間)不會(huì)被保留,相當(dāng)于創(chuàng)建了新文件。如果要保留文件的元信息,需要使用 copy2 函數(shù)(和 copy 函數(shù)用法一致,區(qū)別就是前者不保留文件元信息、后者會(huì)保留)。

copyfile:復(fù)制文件

參數(shù)和 copy、copy2 完全一致,只不過 copyflle 的 dst 如果已存在,那么必須是文件。

#?如果?test?存在并且是目錄,會(huì)報(bào)錯(cuò)
#?PermissionError:?[Errno?13]?Permission?denied:?'test'
shutil.copyfile("1.txt",?"test")

#?如果?test?不存在
#?那么會(huì)創(chuàng)建一個(gè)名為?test?的文件,內(nèi)容和?1.txt?一致
#?如果?test?存在并且不是目錄,那么會(huì)把原來的文件覆蓋掉
shutil.copyfile("1.txt",?"test")

比較簡單,可以自己試一下,所以 copy 要比 copyfile 更高級一些。copyfile 要求 dst 存在時(shí)必須是文件,而 copy 則允許 dst 是目錄,會(huì)自動(dòng)將文件拷貝到目錄中。

使用 copyfile 同樣需要寫權(quán)限,并且 src 和 dst 不能是同一個(gè)文件,否則會(huì)報(bào)錯(cuò):SameFileError。

除了 copyfile 之外,還有一個(gè)更加低級的 copyfileobj。copyfileobj 也是拷貝,接收三個(gè)參數(shù):fsrc、fdst、length,前兩個(gè)參數(shù)和 copy 類似,只不過 fsrc 和 fdst 都必須是打開的文件對象,從名字上也能看出。至于第三個(gè)參數(shù) length 表示緩沖區(qū),默認(rèn)是 16 * 1024 字節(jié),如果為負(fù)數(shù)代表不走緩沖區(qū),而是直接復(fù)制。

import?shutil
from?io?import?StringIO

buf1?=?StringIO()
buf2?=?StringIO()

#?buf1?里面寫入一些內(nèi)容
buf1.write("古明地覺")
#?調(diào)整指針,移到開頭,否則讀取不到內(nèi)容
buf1.seek(0)
#?將?buf1?的內(nèi)容拷貝到?buf2?中
shutil.copyfileobj(buf1,?buf2)
#?查看?buf2?的內(nèi)容
print(buf2.getvalue())??#?古明地覺

雖然 copyfileobj 比較低級,但是它的速度也更快。當(dāng)復(fù)制大文件時(shí),采用 copyfileobj 會(huì)更有效率,復(fù)制小文件則使用 copyfile 會(huì)更方便一些。

copymode:復(fù)制權(quán)限位

參數(shù)和 copy 函數(shù)也完全相同,只不過它是將一個(gè)文件的權(quán)限復(fù)制給另一個(gè)文件。比如 A 文件是只讀,那么復(fù)制給 B 之后 B 也是只讀,但是 A 的內(nèi)容不會(huì)復(fù)制給 B,因?yàn)?copymode 只是復(fù)制權(quán)限。

除了 copymode 還有一個(gè) copystat,參數(shù)也是一樣的,只不過它除了復(fù)制權(quán)限之外還復(fù)制最后訪問時(shí)間、最后修改時(shí)間等元信息,可以自己試一下這兩個(gè)函數(shù)。

copytree:遞歸復(fù)制整個(gè)目錄樹

copytree 方法可以遞歸復(fù)制整個(gè)目錄,并返回目標(biāo)目錄的路徑,函數(shù)原型如下:

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

參數(shù)含義如下:

  • src:表示路徑的字符串,必須是一個(gè)已存在的目錄,不能是文件;
  • dst:表示路徑的字符串,必須是一個(gè)不存在的目錄,否則報(bào)錯(cuò):FileExistsError;
  • symlinks:是否遵循符號(hào)鏈接,默認(rèn)為 True。如果為 True,表示復(fù)制文件,如果為 False,那么當(dāng) src 為軟連接時(shí),則創(chuàng)建一個(gè)新的軟連接;
  • ignore:在復(fù)制的時(shí)候,用于過濾某些文件;
  • copy_function:從默認(rèn)值可以看出,表示拷貝函數(shù),這里采用的是 copy2,會(huì)將文件的元信息也一塊拷過去;
  • ignore_dangling_symlinks:是否忽略 symlinks,如果值為 True 則忽略,值為 False,那么當(dāng)文件不存在時(shí)則產(chǎn)生異常。對于不支持 os.symlink() 的平臺(tái),此參數(shù)無任何影響;

舉個(gè)例子:

import?shutil

#?將?dir1?拷貝為?dir2
shutil.copytree("dir1",?"dir2")

#?將?dir1?拷貝為?dir3,同時(shí)忽略掉?.txt?結(jié)尾的文件
shutil.copytree("dir1",?"dir3",?
????????????????ignore=shutil.ignore_patterns("*.txt"))

disk_usage:獲取磁盤的使用情況

該函數(shù)接收一個(gè)參數(shù) path,會(huì)自動(dòng)獲取該路徑所在磁盤的使用情況:總空間、已使用空間和空閑空間,以字節(jié)為單位。

import?shutil

disk?=?shutil.disk_usage("/")
print(disk)
"""
usage(total=494384795648,?used=71737876480,?free=422646919168)
"""
print(disk.total?/?1024?/?1024?/?1024)
print(disk.used?/?1024?/?1024?/?1024)
print(disk.free?/?1024?/?1024?/?1024)
"""
460.4317207336426
66.81110382080078
393.6206169128418
"""

關(guān)于獲取磁盤信息,之前還介紹過一個(gè)模塊叫 psutil。

get_archive_formats:獲取支持的壓縮格式

一會(huì)要介紹文件壓縮,所以先來看看都支持哪些壓縮格式。

import?shutil
from?pprint?import?pprint

pprint(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')]
"""

既然有壓縮,那么就有解壓縮,get_unpack_formats 函數(shù)可以返回當(dāng)前系統(tǒng)支持的解壓縮格式列表:

import?shutil
from?pprint?import?pprint

pprint(shutil.get_unpack_formats())
"""
[('bztar',?['.tar.bz2',?'.tbz2'],?"bzip2'ed?tar-file"),
?('gztar',?['.tar.gz',?'.tgz'],?"gzip'ed?tar-file"),
?('tar',?['.tar'],?'uncompressed?tar?file'),
?('xztar',?['.tar.xz',?'.txz'],?"xz'ed?tar-file"),
?('zip',?['.zip'],?'ZIP?file')]
"""

get_terminal_size:獲取終端窗口的大小

get_terminal_size 函數(shù)可以獲取終端窗口的大小。

import?shutil

print(shutil.get_terminal_size())
"""
os.terminal_size(columns=80,?lines=24)
"""

系統(tǒng)如果不支持查詢,或者未連接到終端,那么默認(rèn)返回 80, 24。

make_archive:創(chuàng)建壓縮文件

通過 make_archive 可以創(chuàng)建壓縮文件,函數(shù)原型如下:

def?make_archive(base_name,?format,?root_dir=None,?
?????????????????base_dir=None,?verbose=0,?dry_run=0,?
?????????????????owner=None,?group=None,?logger=None):
????...

參數(shù)含義如下:

  • base_name:表示生成的壓縮文件的名稱(不包含擴(kuò)展名),也可以是完整路徑。如果只寫文件名則保存到當(dāng)前目錄,否則保存到指定路徑;
  • format:表示壓縮包格式,如 zip、tar、bztar、gztar 等,會(huì)根據(jù) format 生成擴(kuò)展名并拼接到 base_name 后面;
  • root_dir:表示要壓縮的目錄路徑,默認(rèn)是當(dāng)前目錄;
  • base_dir:表示要壓縮的目錄路徑,默認(rèn)為當(dāng)前目錄;那么問題來了,它和 root_dir 之間有什么區(qū)別呢?假設(shè)我們要對 dir1 目錄進(jìn)行壓縮,壓縮后的文件名是 xx.zip。如果指定的是 root_dir="dir1",那么 xx.zip 解壓之后得到的目錄的名字為 xx;如果指定的是 base_dir="dir1",那么 xx.zip 解壓之后得到的目錄的名字仍是 dir1。當(dāng)然不管目錄名是 xx 還是 dir1,里面存儲(chǔ)的內(nèi)容不變,這兩個(gè)參數(shù)我們指定一個(gè)即可;
  • verbose:已棄用;
  • dry_run:表示是否創(chuàng)建存檔,如果 dry_run 為 True,則不會(huì)創(chuàng)建存檔,但會(huì)將執(zhí)行的操作記錄到 logger;
  • owner:可選參數(shù),用于指定用戶,默認(rèn)為當(dāng)前用戶;
  • group:可選參數(shù),用于指定組,默認(rèn)為當(dāng)前組;
  • logger:用于記錄日志,通常為 logging.Logger 對象;

make_archive 函數(shù)依賴于 zipfile 和 tarfile 模塊。

import?shutil

shutil.make_archive("xx",?"zip",??root_dir="dir1")

之后會(huì)在當(dāng)前目錄中出現(xiàn)一個(gè) xx.zip,目錄 "dir1" 里面的所有內(nèi)容都會(huì)被壓縮到里面。

有壓縮,那么自然有解壓縮:

shutil.unpack_archive(filename,?extract_dir=None,?format=None)
"""
filename:?解壓縮文件的路徑
extract_dir:?解壓到哪個(gè)目錄,未指定則解壓到當(dāng)前目錄
format:?壓縮文件的格式,如:zip、bztar、gztar 等等
????????如果沒有提供,那么根據(jù)壓縮文件的擴(kuò)展名進(jìn)行推斷
"""

該方法同樣依賴于 zipfile 和 tarfile 兩個(gè)模塊。

move:移動(dòng)文件和目錄

move 函數(shù)用于將文件或目錄移動(dòng)到目標(biāo)目錄,如果移動(dòng)到了不同的文件系統(tǒng)中,那么移動(dòng)將會(huì)變成復(fù)制。這里我們考慮同一個(gè)文件系統(tǒng)即可,想拷貝的話,建議使用 copy 函數(shù)。下面看一下 move 函數(shù)的用法:

import?shutil

"""
src:?源文件或目錄
dst:?路徑不存在相當(dāng)于重命名,存在則進(jìn)行移動(dòng)
copy_function:默認(rèn)是 copy2
"""
#?dir22?不存在,所以相當(dāng)于將?dir2?重命名為?dir22
shutil.move("dir2",?"dir22")

#?dir3?存在,所以會(huì)將?dir22?移動(dòng)到?dir3?中
shutil.move("dir22",?"dir3")

當(dāng) dst 不存在時(shí),無論 src 是文件還是目錄,都相當(dāng)于重命名。如果 dst 存在并且是目錄,那么 src 無論是文件還是目錄,都會(huì)被移動(dòng)到 dst 里面去。如果 dst 存在并且是文件,那么 src 必須也是一個(gè)文件,此時(shí)相當(dāng)于覆蓋,可以理解為先刪除 dst、再將 src 重命名為 dst。

rmtree:刪除整個(gè)目錄樹

rmtree 函數(shù)用于刪除整個(gè)目錄樹,參數(shù)如下:

  • path:表示路徑的字符串,必須是一個(gè)目錄,不能是文件;
  • ignore_errors:默認(rèn)為 False,表示是否忽略刪除中出現(xiàn)的錯(cuò)誤。如果為 True 表示忽略、為 False 表示不忽略;
  • onerror:一個(gè)錯(cuò)誤處理函數(shù),出現(xiàn)異常時(shí)自動(dòng)調(diào)用,并且會(huì)往里面?zhèn)鬟f三個(gè)參數(shù):os.lstat、path(路徑)、excinfo(返回的異常信息)。如果 onerror 被省略,那么當(dāng)發(fā)生錯(cuò)誤時(shí)會(huì)給出提示;
import?os
import?shutil

print(os.access("dir3",?os.F_OK))??#?True
shutil.rmtree("dir3")
print(os.access("dir3",?os.F_OK))??#?False

which:獲取可執(zhí)行文件的路徑

我們在終端中輸入 python 的時(shí)候會(huì)自動(dòng)進(jìn)入交互式解釋器,這是因?yàn)樵诃h(huán)境變量中配置了 python 解釋器的路徑,而通過 which 函數(shù)可以獲取相應(yīng)的路徑。該函數(shù)接收的參數(shù)如下:

  • cmd:相關(guān)命令;
  • mode:用于指定需要傳遞的權(quán)限掩碼,默認(rèn)為 os.F_OK | os.X_OK,表示測試路徑是否存在、并且是否可執(zhí)行;
  • path:默認(rèn)為 None,表示查找 cmd 命令的路徑。如果不指定則在環(huán)境變量中查找,指定了則在指定的路徑參數(shù)中查找。但是注意:不管該參數(shù)有沒有指定,當(dāng)前目錄始終會(huì)被添加到搜索路徑中;
import?shutil

print(shutil.which("python"))??#?/usr/bin/python
print(shutil.which("gcc"))??#?/usr/bin/gcc
print(shutil.which("xxxxx"))??#?None

如果找不到的話,返回 None。

到此這篇關(guān)于Python利用shutil實(shí)現(xiàn)拷貝文件功能的文章就介紹到這了,更多相關(guān)Python shutil拷貝文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python獲取SQLite查詢結(jié)果表列名的方法

    Python獲取SQLite查詢結(jié)果表列名的方法

    這篇文章主要介紹了Python獲取SQLite查詢結(jié)果表列名的方法,涉及Python連接及查詢SQLite數(shù)據(jù)庫的相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • Python numpy.zero() 初始化矩陣實(shí)例

    Python numpy.zero() 初始化矩陣實(shí)例

    今天小編就為大家分享一篇Python numpy.zero() 初始化矩陣實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python爬蟲之BeautifulSoup 使用select方法詳解

    python爬蟲之BeautifulSoup 使用select方法詳解

    本篇文章主要介紹了python爬蟲之BeautifulSoup 使用select方法詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 基于tensorflow for循環(huán) while循環(huán)案例

    基于tensorflow for循環(huán) while循環(huán)案例

    這篇文章主要介紹了基于tensorflow for循環(huán) while循環(huán)案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python 時(shí)間操作datetime詳情(下)

    Python 時(shí)間操作datetime詳情(下)

    我們在上一文datetime模塊對datetime模塊中包含了六個(gè)類對象如date、time、datetime等對時(shí)間和日期進(jìn)行操作。這一篇文章我們繼續(xù)上一篇文章的內(nèi)容學(xué)習(xí)datetime模塊中六大類的相關(guān)方法和屬性
    2021-11-11
  • python安裝cxOracle避坑總結(jié)不要直接pip install

    python安裝cxOracle避坑總結(jié)不要直接pip install

    這篇文章主要為大家介紹了python安裝cx_Oracle是遇到的一些問題的解決辦法的總結(jié),來幫大家避避坑有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步
    2021-10-10
  • 一篇文章教你用Python實(shí)現(xiàn)一鍵文件重命名

    一篇文章教你用Python實(shí)現(xiàn)一鍵文件重命名

    這篇文章主要介紹了如何用python一鍵文件重命名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python中利用原始套接字進(jìn)行網(wǎng)絡(luò)編程的示例

    Python中利用原始套接字進(jìn)行網(wǎng)絡(luò)編程的示例

    這篇文章主要介紹了Python中利用原始套接字進(jìn)行網(wǎng)絡(luò)編程的示例,使用sock_raw接受和發(fā)送數(shù)據(jù)包可以避開網(wǎng)絡(luò)協(xié)議的諸多限制,需要的朋友可以參考下
    2015-05-05
  • python xlsxwriter模塊的使用

    python xlsxwriter模塊的使用

    這篇文章主要介紹了python xlsxwriter模塊的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python 中@property的用法詳解

    Python 中@property的用法詳解

    這篇文章主要介紹了Python 中@property的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論