shutil模塊提供移動(dòng)、復(fù)制、打包文件等高階操作。1.移動(dòng)用shutil.move(),可重命名或覆蓋文件;2.復(fù)制單個(gè)文件用shutil.copy(),保留內(nèi)容和權(quán)限,復(fù)制目錄用shutil.copytree(),目標(biāo)路徑不可存在;3.打包用shutil.make_archive(),支持zip/tar格式,解壓用shutil.unpack_archive();4.其他功能包括刪除目錄shutil.rmtree()、查找命令shutil.which()、查看磁盤使用shutil.disk_usage(),使用時(shí)注意測(cè)試防止誤刪。
在 python 中處理文件和目錄時(shí),除了基本的讀寫(xiě)操作,有時(shí)候還需要進(jìn)行移動(dòng)、復(fù)制甚至打包歸檔等操作。這時(shí)候 shutil 模塊就派上用場(chǎng)了。它提供了很多方便的函數(shù),讓你能輕松完成這些“高階”文件操作。
移動(dòng)文件或目錄:shutil.move()
如果你需要把一個(gè)文件或者整個(gè)目錄從一個(gè)地方挪到另一個(gè)地方,shutil.move() 就是你的首選。
這個(gè)函數(shù)的行為很像系統(tǒng)里的“剪切+粘貼”,使用起來(lái)也非常簡(jiǎn)單:
import shutil shutil.move('source_folder/file.txt', 'target_folder/')
- 如果目標(biāo)路徑不存在,會(huì)自動(dòng)創(chuàng)建。
- 如果目標(biāo)路徑已經(jīng)存在同名文件,會(huì)被覆蓋(注意備份)。
- 如果你移動(dòng)的是一個(gè)目錄,里面的所有內(nèi)容都會(huì)被一起移過(guò)去。
一個(gè)小技巧:如果你想重命名文件也可以用這個(gè)方法,只要在目標(biāo)路徑里改個(gè)名字就行,比如:shutil.move(‘old_name.txt’, ‘new_name.txt’)
復(fù)制文件或目錄:shutil.copy() 和 shutil.copytree()
復(fù)制比移動(dòng)更常用,特別是你想保留原文件的情況下。常用的有兩個(gè)函數(shù):
立即學(xué)習(xí)“Python免費(fèi)學(xué)習(xí)筆記(深入)”;
- shutil.copy(src, dst):復(fù)制單個(gè)文件
- shutil.copytree(src, dst):復(fù)制整個(gè)目錄及其內(nèi)容
舉個(gè)例子:
# 復(fù)制單個(gè)文件 shutil.copy('source.txt', 'backup.txt') # 復(fù)制整個(gè)文件夾 shutil.copytree('original_dir', 'backup_dir')
需要注意的地方:
- copy() 會(huì)保留原文件的內(nèi)容和權(quán)限信息,但不會(huì)復(fù)制元數(shù)據(jù)(如時(shí)間戳)
- 如果想復(fù)制元數(shù)據(jù),可以用 copy2() 替代
- copytree() 的目標(biāo)路徑不能已存在,否則會(huì)報(bào)錯(cuò)
打包與解壓:shutil.make_archive() 和 shutil.unpack_archive()
當(dāng)你想把一堆文件打成壓縮包,或者反過(guò)來(lái)解壓一個(gè) zip 文件,shutil 同樣支持。
打包成壓縮文件
shutil.make_archive('backup', 'zip', 'my_files')
這段代碼會(huì)把 my_files 目錄下的所有內(nèi)容打包成 backup.zip。
- 第一個(gè)參數(shù)是輸出文件名(不含擴(kuò)展名)
- 第二個(gè)參數(shù)是格式,可以是 ‘zip’, ‘tar’, ‘gztar’ 等
- 第三個(gè)參數(shù)是要打包的目錄
解壓文件
shutil.unpack_archive('backup.zip', 'extract_here')
- 第一個(gè)參數(shù)是壓縮包路徑
- 第二個(gè)參數(shù)是解壓的目標(biāo)路徑,不填的話默認(rèn)當(dāng)前目錄
其他實(shí)用功能簡(jiǎn)要提一下
雖然不是標(biāo)題重點(diǎn),但這里順便提幾個(gè)有用的函數(shù):
- shutil.rmtree(path):刪除整個(gè)目錄(包括里面的文件)
- shutil.which(cmd):查找某個(gè)命令是否存在 PATH 中
- shutil.disk_usage(path):查看磁盤使用情況
這些都能在日常腳本開(kāi)發(fā)中帶來(lái)便利。
基本上就這些,shutil 雖然功能不算復(fù)雜,但非常實(shí)用。關(guān)鍵是在做批量文件操作時(shí),能省下不少手動(dòng)處理的時(shí)間。不過(guò)也正因?yàn)樗摹捌茐男浴辈僮鬏^多,比如移動(dòng)、刪除,建議在正式運(yùn)行前多測(cè)試幾次,防止誤刪重要文件。