shutil模塊 高級的 文件、文件夾、壓縮包 處理模塊 os模塊提供了對目錄或者文件的新建/刪除/查看文件屬性,還提供了對文件以及目錄的路徑操作。比如說:絕對路徑,父目錄…… 但是,os文件的操作還應該包含移動 複製 打包 壓縮 解壓等操作,這些os模塊都沒有提供。 而本文所講的shutil則就是 ...
shutil模塊
高級的 文件、文件夾、壓縮包 處理模塊
os模塊提供了對目錄或者文件的新建/刪除/查看文件屬性,還提供了對文件以及目錄的路徑操作。比如說:絕對路徑,父目錄…… 但是,os文件的操作還應該包含移動 複製 打包 壓縮 解壓等操作,這些os模塊都沒有提供。
而本文所講的shutil則就是對os中文件操作的補充。--移動 複製 打包 壓縮 解壓。
1、shutil.copyfileobj(fsrc, fdst[, length])
import shutil
f1 = open("alexsb","r",encoding="utf-8")
f2 = open("文件2","w",encoding='utf-8')
shutil.copyfileobj(f1,f2)
f1.close()
f2.close()
把一個文件複製到另外一個文件,記得要同時打開兩個文件,如果是Windows,要加上encoding="utf-8",以"utf-8"讀取和複製。
2、shutil.copyfile(src, dst)
源代碼:從下麵源代碼可以看出,copyfile()方法自己打開模塊,不需要我們再去打開模塊,第一個模塊是以"rb"模式打開,第二個模式是以"wb"模式打開,如果文件存在,從衝掉之前文件裡面的內容。
def copyfile(src, dst, *, follow_symlinks=True): if _samefile(src, dst): raise SameFileError("{!r} and {!r} are the same file".format(src, dst)) for fn in [src, dst]: try: st = os.stat(fn) except OSError: # File most likely does not exist pass else: # XXX What about other special files? (sockets, devices...) if stat.S_ISFIFO(st.st_mode): raise SpecialFileError("`%s` is a named pipe" % fn) if not follow_symlinks and os.path.islink(src): os.symlink(os.readlink(src), dst) else: with open(src, 'rb') as fsrc: with open(dst, 'wb') as fdst: copyfileobj(fsrc, fdst) return dst
import shutil
shutil.copyfile("文件2","文件3")
shutil.copyfile("被賦值文件","賦值文件")也是賦值文件,只是不需要打開文件,把一個文件賦值到另外一個文件中,如果這個文件不存在,則新建一個文件。
3.shutil.copymode(src, dst)
僅拷貝許可權。內容、組、用戶均不變
def copymode(src,dst):
'''Copy mode bits from src to dst'''
if hasattr(os,"chmod"):
st = os.stat(src)
mode = stat.S_IMODE(st,st_mode)
os.chmod(dst,mode)
在Linux平臺上,文件有很多許可權,shutil.copymode(src,dst)只讓用戶copy許可權,不複製文件內容。
4.shutil.copystat(src, dst)
拷貝狀態的信息,包括:mode bits, atime, mtime, flags
import shutilf1 = open("文件2","rb")
f2 = open("文件4","wb")
shutil.copystat("文件2","文件4")
5.shutil.copy(src, dst)
複製文件的內容以及許可權,先copyfile後copymode
6.shutil.copy2(src, dst)
複製文件的內容以及文件的所有狀態信息。先copyfile後copystat
7.shutil.ignore_patterns(*patterns)
8.shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,ignore_dangling_symlinks=False)
遞歸的複製文件內容及狀態信息
shutil.copytree()遞歸地copy目錄和文件,等於複製了一份完全一樣的源文件。
import shutil
shutil.copytree("copytrees","new_copytrees")
創建一個一模一樣的目錄和文件,複製裡面所有的內容,這個功能還是很強大的。就相當於直接點擊複製粘貼。
9.shutil.rmtree(path[, ignore_errors[, onerror]])
遞歸的去刪除文件
import shutil
shutil.rmtree("new_copytrees")
shutil.rmtree(path)是遞歸的刪除文件,即便文件裡面有內容也能夠刪除,我們知道,os.rmdir()如果文件有內容是不能刪除的,相比較,系統的功能是強大很多,從底層刪除文件。
10.shutil.move(src, dst)
遞歸的去移動文件
11.shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None)
創建壓縮包並返迴文件路徑,例如:zip、tar
(1)base_name:壓縮包的文件名,也可以是壓縮包的路徑。只是文件名時,則保存至當前目錄,否則保存至指定路徑,
如:www >>保存至當前路徑
如:/users/wupeiqi/www ==>>保存至/Users/wupeiqi/下麵
(2)format:壓縮包種類,"zip","tar","bztar","gztar"
(3)root_dir:要壓縮的文件夾路徑(預設當前目錄)
(4)owner:用戶,預設當前用戶
(5)logger:用於記錄日誌,通常是logging.Logger對象
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置當前程式目錄
import shutil
ret = shutil.make_archive("只能壓縮文件", 'gztar', root_dir='/home/zhuzhu/第五天/copytrees')
#將 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目錄
import
shutil
ret
=
shutil.make_archive(
"/Users/wupeiqi/wwwwwwwwww"
,
'gztar'
, root_dir
=
'/Users/wupeiqi/Downloads/test'
)
make_archive()只能壓縮目錄(directory),不能壓縮文件(file)或這.py文件,只能是整體把文件目錄進行壓縮。
shutil對文件的壓縮是通過調用zipfile和tarfile來進行壓縮的。
zipfile 模塊壓縮解壓
zipfile能夠指定壓縮那個目錄的文件,就是可以自助定義壓縮,也是比較好的,我們可以壓縮文件,shutil只能整體壓縮目錄,而zipfile能夠壓縮各個文件(File)類型。
實例如下:
壓縮
import zipfile
'''調用zipfile模塊,隨便壓縮問價'''
z = zipfile.ZipFile("想壓誰壓誰.zip","w") #創建一個壓縮包
z.write("/home/zhuzhu/第五天/文件2") #向壓縮包添加壓縮文件2
z.write("/home/zhuzhu/第五天/time_sleep.py") #向壓縮包添加Python腳本time_sleep.py
z.close() #關閉壓縮文件
解壓
import zipfile
'''調用zipfile模塊解壓文件'''
z = zipfile.ZipFile("想壓誰壓誰.zip","r") #解壓文件
z.extractall() #調用extract()解壓
z.close()
tarfile 模塊壓縮解壓
tar壓縮
import tarfile
z = tarfile.open("test.tar","w")
'''打開壓縮文件,如果壓縮包不存在,則重新創建,如果存在,則刪除裡面的內容'''
z.add("/home/zhuzhu/第五天/文件3") #向壓縮包添加壓縮文件
z.add("/home/zhuzhu/第五天/sys_argv.py")
z.close() #關閉壓縮包
tar解壓
import tarfile
'''解壓文件'''
z = tarfile.open("test.tar","r")
z.extractall()
z.close()
zipfile和tarfile壓縮解壓文件。