要實現(xiàn)復制、移動、改名以及刪除文件或文件夾,需要用到 shutil 模塊,shutil 是 shell util 的簡寫形式,表示 shell 工具。
創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網站建設、網站重做改版、三門峽網站定制設計、自適應品牌網站建設、HTML5、電子商務商城網站建設、集團公司官網建設、外貿網站建設、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為三門峽等各大城市提供網站開發(fā)制作服務。
調用 shutil.copy(source, destination) 來實現(xiàn)復制文件或文件夾功能,依據(jù) destination 進行區(qū)分:
運行結果:
注意: 指定復制的文件夾必須存在,否則會拋出 FileNotFoundError。
shutil 的 copytree(source, destination) 方法會復制整個文件夾,包括它所包含的所有文件夾和文件。source
指定源文件夾,destination 指定新的文件夾。source 和 destination 入?yún)⒍际亲址T摵瘮?shù)會返回新文件夾的路徑。destination 如果不存在,會自動創(chuàng)建。請看下例:
運行結果:
shutil.move(source, destination) 方法會將路徑 source 處的文件移動到路徑 destination,并返回新位置的絕對路徑的字符串。
如果 destination 指向一個文件夾, source 處的文件將移動到 destination 中, 并保持原來的文件名。
運行結果:
注意:
os 模塊中的函數(shù),可以實現(xiàn)刪除一個文件或一個空文件夾。而 shutil 更強大,使用它可以刪除一個非空文件夾!
注意: 因為是永久刪除,所以使用這些函數(shù)一定要小心!建議調試程序時, 先注釋掉這些刪除方法,
然后加上 print(), 把要被刪除的文件打印出來,確認后,再執(zhí)行。
打印出來的文件列表確認無誤后,再執(zhí)行 os.unlink(filename) 執(zhí)行刪除操作。
send2trash 模塊會將文件夾或文件發(fā)送到計算機的回收站。首先,安裝它:
安裝成功后,調用 send2trash.send2trash 方法,就可以把文件夾或文件發(fā)送到計算機的回收站。請看下例:
建議使用 send2trash.send2trash() 函數(shù)來刪除文件或文件夾,因為以后還可以從回收站還原。但這樣做,不
會釋放磁盤空間。如果我們還是希望程序釋放磁盤空間, 就要用 os 和 shutil 來刪除文件和
文件夾(記得使用之前提出的 print 技巧)。還有一點需要注意, send2trash() 函數(shù)只能將文件送到回收站, 但不能從回收站中恢復文件。
shutil 是高級的文件,文件夾,壓縮包處理模塊。
1.shutil.copyfileobj(fsrc, fdst[, length])
將文件內容拷貝到另一個文件中
import shutil
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
2.shutil.copyfile(src, dst)
拷貝文件
shutil.copyfile('f1.log', 'f2.log')
3.shutil.copymode(src, dst)
僅拷貝權限。內容、組、用戶均不變
shutil.copymode('f1.log', 'f2.log')
4.shutil.copystat(src, dst)
僅拷貝狀態(tài)的信息,包括:mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log')
5.shutil.copy(src, dst)
拷貝文件和權限
shutil.copy('f1.log', 'f2.log')
6.shutil.copy2(src, dst)
拷貝文件和狀態(tài)信息
shutil.copy2('f1.log', 'f2.log')
7.shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
遞歸的去拷貝文件夾
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
8.shutil.rmtree(path[, ignore_errors[, onerror]])
遞歸的去刪除文件
shutil.rmtree('folder1')
9.shutil.move(src, dst)
遞歸的去移動文件,它類似mv命令,其實就是重命名。
shutil.move('folder1', 'folder3')
10.shutil.make_archive(base_name, format,...)
創(chuàng)建壓縮包并返回文件路徑,例如:zip、tar
創(chuàng)建壓縮包并返回文件路徑,例如:zip、tar
base_name: 壓縮包的文件名,也可以是壓縮包的路徑。只是文件名時,則保存至當前目錄,否則保存至指定路徑,
如:www ? ? ? ? ? ? ? ? ? ? ? ?=保存至當前路徑
如:/Users/wupeiqi/www =保存至/Users/wupeiqi/
format: 壓縮包種類,“zip”, “tar”, “bztar”,“gztar”
root_dir: 要壓縮的文件夾路徑(默認當前目錄)
owner: 用戶,默認當前用戶
group: 組,默認當前組
logger: 用于記錄日志,通常是logging.Logger對象
file類中沒有提供專門的文件復制函數(shù),因此只能通過使用文件的讀寫函數(shù)來實現(xiàn)文件的復制。這里僅僅給出范例:
src = file("myfile.txt", "w+")
temp = ["hello world! \n"]
src.writelines(temp)
src.close()
src = file("myfile.txt", "r+")
des = file("myfile2.txt", "w+")
des.writelines(src.read())
src.close()
des.close()
shutil模塊是另一個文件,目錄的管理接口,提供了一些用于復制文件,目錄的函數(shù)。copyfile()函數(shù)可以實現(xiàn)文件的拷貝,聲明如下:
copyfile(src, des)
文件的剪切可以使用move()函數(shù)模擬,聲明如下:
move(src,des)
功能:移動一個文件或者目錄到指定的位置,并且可以根據(jù)參數(shù)des重命名移動后的文件。
shutil.copyfile(src, dst):將名為src的文件的內容復制到名為dst的文件中 。
src, dst是文件名
shutil.copy(source, destination)
shutil.copy() 函數(shù)實現(xiàn)文件復制功能,將 source 文件復制到 destination 文件夾中,兩個參數(shù)都是字符串格式。如果 destination 是一個文件名稱,那么它會被用來當作復制后的文件名稱,即等于 復制 + 重命名。
source一定是文件名,destination可以是文件名也可以是文件夾名
舉例如下:
shutil 模塊
Python賦值操作或函數(shù)參數(shù)傳遞,傳遞的永遠是對象引用(即內存地址),而不是對象內容。在Python中一切皆對象,對象又分為可變(mutable)和不可變(immutable)兩種類型。對象拷貝是指在內存中創(chuàng)建新的對象,產生新的內存地址。當頂層對象和它的子元素對象全都是immutable不可變對象時,不存在被拷貝,因為沒有產生新對象。淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象。
Python中一切皆對象,對象就像一個塑料盒子, 里面裝的是數(shù)據(jù)。對象有不同類型,例如布爾型和整型,類型決定了可以對它進行的操作?,F(xiàn)實生活中的"陶器"會暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。
對象的類型還決定了它裝著的數(shù)據(jù)是允許被修改的變量(可變的mutable)還是不可被修改的常量(不可變的immutable)。你可以把不可變對象想象成一個透明但封閉的盒子:你可以看到里面裝的數(shù)據(jù),但是無法改變它。類似地,可變對象就像一個開著口的盒子,你不僅可以看到里面的數(shù)據(jù),還可以拿出來修改它,但你無法改變這個盒子本身,即你無法改變對象的類型。
對象拷貝是指在內存中創(chuàng)建新的對象,產生新的內存地址。
淺拷貝(Shallow Copy),拷貝頂層對象,但不會拷貝內部的子元素對象。
2.1.1. 頂層是mutable,子元素全是immutable
當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, 'world', 2]
① 創(chuàng)建列表對象并賦值給變量a
② 導入copy模塊,使用copy.copy()函數(shù)淺拷貝a,并賦值給變量b
③ 修改變量a的子元素a[0] = 3,由于整數(shù)是不可變對象,所以并不是修改1變?yōu)?,而是更改a[0]指向對象3
當頂層對象是 mutable可變對象 ,但子元素也存在 mutable可變對象 時,如 [1, 2, ['hello','world']]
① 淺拷貝 copy.copy() 只拷貝了頂層對象,沒有拷貝子元素對象['hello','world'],即a[2]和b[2]指向同一個列表對象
② 修改a[2][1] = 'china',則b[2][1] = 'china'
當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)
變量a與變量b指向的是同一個元組對象,沒有拷貝
當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, ['hello','world'])
變量a與變量b指向的是相同的元組對象,并且a[2]與b[2]指向同一個列表,所以修改a[2][1]會影響b[2][1]
深拷貝(Deep Copy),遞歸拷貝頂層對象,以及它內部的子元素對象
當頂層對象是mutable可變對象,但是它的子元素對象全都是immutable不可變對象時,如[1, 'world', 2]
變量a與變量b指向不同的列表對象,修改a[0]只是將列表a的第一個元素重新指向新對象,不會影響b[0]
當頂層對象是mutable可變對象,但子元素也存在mutable可變對象時,如[1, 2, ['hello','world']]
深拷貝既拷貝了頂層對象,又遞歸拷貝了子元素對象,所以a[2]與b[2]指向了兩個不同的列表對象(但是列表對象的子元素初始指定的字符串對象一樣),修改a[2][1] = 'china'后,它重新指向了新的字符串對象(內存地址為140531581905808),不會影響到b[2][1]
當頂層對象是immutable不可變對象,同時它的子元素對象也全都是immutable不可變對象時,如(1, 2, 3)
變量a與變量b指向的是同一個元組對象,不存在拷貝
當頂層對象是immutable不可變對象時,但子元素存在mutable可變對象時,如(1, 2, ['hello','world'])
變量a與變量b指向的是不同的元組對象,同時a[2]與b[2]指向不同的列表對象,所以修改a[2][1]不會影響b[2][1]
使用=是賦值,即將列表對象的引用也賦值給變量b,可以將列表對象想像成一個盒子,變量a相當于這個盒子上的標簽,執(zhí)行b = a后,相當于再在這個盒子上貼上b標簽,a和b實際上指向的是同一個對象。因此,無論我們是通過a還是通過b來修改列表的內容,其結果都會作用于雙方。
b/c/d都是a的復制,它們都指向了不同的列表對象,但是沒有拷貝子元素,a[2]和b[2]/c[2]/d[2]指向同一個列表, 相當于淺拷貝的效果
使用分片[:]操作,a和b其實是指向同一個元組,而且沒有拷貝子元素,a[2]和b[2]也指向同一個列表,相當于淺拷貝的效果
同列表類似,可以使用字典的copy()函數(shù)或者轉換函數(shù)dict()
變量a與變量b/c指向不同的字典,但是沒有拷貝子元素,a['jobs']和b['jobs']/c['jobs']指定同一個列表, 相當于淺拷貝的效果
同列表類似,可以使用集合的copy()函數(shù)或者轉換函數(shù)set()
變量a與變量b/c指向不同的集合,而集合的元素必須是hashable,所以修改集合a不會影響到b/c