我是如何用10行代码搬运目标图片的?
嗯呢,你沒看錯,就是教你把一個路徑下的所有目標圖片搬運到制定路徑下。有讀者說:小詹你忽悠人吧,要搬運目標圖片復制粘貼不就好了嘛,要什么代碼,搬磚腦子秀逗了?
咳咳,對于目標文件夾復制粘貼當然可以,還簡單易操作。但是如果你要的目標圖片在某一路徑下不同深度的子文件夾中呢?如果該文件夾中各種格式的文件扎堆在一起呢?比如下面這樣:
如果你要搬運的圖片是上邊那樣存放的呢?如果層數更多更復雜呢?如果圖片數量龐大呢?如果其他格式的文件干擾呢?(不要覺得這現象少見,在處理數據集的時候多少都會遇到的~)復制粘貼效率就不行了吧!別忘了咱們是誰,是改變世界的程序猿啊!這不,哪怕再復雜,下邊用10來行代碼輕松搞定~
說的很有趣很高深似的,其實就是用了Python的兩個模塊os和shutil罷了,用到其中兩個方法,一一道來。
1.首先是文件復制方法
shutil.copy(src,dst)
復制一個文件到另一個文件或目錄,對于本例而言就是單次操作的圖片。
2.還有遍歷目錄操作
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])
top?— 是你所要遍歷的目錄的地址, 返回的是一個三元組(root,dirs,files)。
root 所指的是當前正在遍歷的這個文件夾的本身的地址
dirs 是一個 list ,內容是該文件夾中所有的目錄的名字(不包括子目錄)
files 同樣是 list , 內容是該文件夾中所有的文件(不包括子目錄)
topdown –可選,為 True,則優先遍歷 top 目錄,否則優先遍歷 top 的子目錄(默認為開啟)。如果 topdown 參數為 True,walk 會遍歷top文件夾,與top 文件夾中每一個子目錄。
onerror — 可選,需要一個 callable 對象,當 walk 需要異常時,會調用。
followlinks — 可選,如果為 True,則會遍歷目錄下的快捷方式,如果為 False,則優先遍歷 top 的子目錄。
弄明白這兩個關鍵方法,要實現目標圖片的搬運就只需要10行代碼了~
import?os,shutil?
print('輸入格式:E:\myprojectnew\jupyter\整理文件夾\示例')
path?=?input('請鍵入需要整理的文件夾地址:')
new_path?=?input('請鍵入要復制到的文件夾地址:')
for?root,?dirs,?files?in?os.walk(path):??
????for?i?in?range(len(files)):
????????if?(files[i][-3:]?==?'jpg')?or?(files[i][-3:]?==?'png')?or?(files[i][-3:]?==?'JPG'):
????????????file_path?=?root+'/'+files[i]??
????????????new_file_path?=?new_path+?'/'+?files[i]??
????????????shutil.copy(file_path,new_file_path)?
運行后只需要指定你想要復制的圖片所在路徑為path,欲復制到的路徑為new_path,就可以等著自動將圖片復制到指定路徑下了,當然目標不限于圖片噢。
3.相關補充
os模塊和shutil模塊常用的方法還有以下幾種~
#?os模塊
os.sep????可以取代操作系統特定的路徑分隔符。windows下為?'\\'
os.name????字符串指示你正在使用的平臺。比如對于Windows,它是'nt',而對于Linux/Unix用戶,它是?'posix'
os.getcwd()????函數得到當前工作目錄,即當前Python腳本工作的目錄路徑
os.getenv()????獲取一個環境變量,如果沒有返回none
os.putenv(key,?value)????設置一個環境變量值
os.listdir(path)????返回指定目錄下的所有文件和目錄名
os.remove(path)????函數用來刪除一個文件
os.system(command)????函數用來運行shell命令
os.linesep????字符串給出當前平臺使用的行終止符。例如,Windows使用?'\r\n',Linux使用?'\n'?而Mac使用?'\r'
os.path.split(path)????????函數返回一個路徑的目錄名和文件名
os.path.isfile()????和os.path.isdir()函數分別檢驗給出的路徑是一個文件還是目錄
os.path.exists()????函數用來檢驗給出的路徑是否真地存在
os.curdir????????返回當前目錄?('.')
os.mkdir(path)????創建一個目錄
os.makedirs(path)????遞歸的創建目錄
os.chdir(dirname)????改變工作目錄到dirname??????????
os.path.getsize(name)????獲得文件大小,如果name是目錄返回0L
os.path.abspath(name)????獲得絕對路徑
os.path.normpath(path)????規范path字符串形式
os.path.splitext()????????分離文件名與擴展名
os.path.join(path,name)????連接目錄與文件名或目錄
os.path.basename(path)????返回文件名
os.path.dirname(path)????返回文件路徑
os.walk(top,topdown=True,οnerrοr=None)????????遍歷迭代目錄
os.rename(src,?dst)????????重命名file或者directory?src到dst?如果dst是一個存在的directory,?將拋出OSError.?在Unix,?如果dst在存且是一個file,?如果用戶有權限的話,它將被安靜的替換.?操作將會失敗在某些Unix?中如果src和dst在不同的文件系統中.?如果成功,?這命名操作將會是一個原子操作?(這是POSIX?需要).?在?Windows上,?如果dst已經存在,?將拋出OSError,即使它是一個文件.?在unix,Windows中有效。
os.renames(old,?new)????遞歸重命名文件夾或者文件。像rename()
#?shutil?模塊
shutil.copyfile(?src,?dst)????從源src復制到dst中去。當然前提是目標地址是具備可寫權限。拋出的異常信息為IOException.?如果當前的dst已存在的話就會被覆蓋掉
shutil.move(?src,?dst)????????移動文件或重命名
shutil.copymode(?src,?dst)????只是會復制其權限其他的東西是不會被復制的
shutil.copystat(?src,?dst)????復制權限、最后訪問時間、最后修改時間
shutil.copy(?src,?dst)????????復制一個文件到一個文件或一個目錄
shutil.copy2(?src,?dst)????????在copy上的基礎上再復制文件最后訪問時間與修改時間也復制過來了,類似于cp?–p的東西
shutil.copy2(?src,?dst)????????如果兩個位置的文件系統是一樣的話相當于是rename操作,只是改名;如果是不在相同的文件系統的話就是做move操作
shutil.copytree(?olddir,?newdir,?True/Flase)
把olddir拷貝一份newdir,如果第3個參數是True,則復制目錄時將保持文件夾下的符號連接,如果第3個參數是False,則將在復制的目錄下生成物理副本來替代符號連接
shutil.rmtree(?src?)????遞歸刪除一個目錄以及目錄內的所有內容
推薦閱讀:
春招,這 110 道 Python 面試題你看了嗎?
總結
以上是生活随笔為你收集整理的我是如何用10行代码搬运目标图片的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【实战篇】| 模拟 20 万数据快速查询
- 下一篇: 本周清明节连续放5天?为啥?