Python實(shí)現(xiàn)移動(dòng)指定圖片到指定目錄
一、背景
前陣子,拍了200張照片,然后挑了20張找人精修下,今天修完發(fā)來給我,然后我先對(duì)比一下和原圖的效果差異,以便做驗(yàn)收。
由于前期挑出來的照片沒有留檔,也就是說,還是在200張的源文件夾里,怎么從這200張圖片中找出這20張呢?
幸運(yùn)的是,精修完的圖沒有修改文件名,能夠通過文件名去源文件夾找出來。那么,如何才能快速地找出這20張照片呢?
一張張搜唄!不行,太費(fèi)事了!
那能不能讓Python 來搭把手呢?當(dāng)然可以!
環(huán)境說明:Python 3.9.12、windows11 64位,該代碼應(yīng)該通用,是一些內(nèi)置庫。
二、梳理需求
其實(shí)很簡單,前面也介紹了:就是拿精修圖的文件名去源文件夾中找,然后把文件移動(dòng)到指定的文件夾。
拆分步驟來看就是:獲取精修圖的名稱->在源文件夾查找->將源文件找到的圖片放到指定的文件夾中。
2.1 獲取精修圖名稱
獲取精修的20張圖的名稱,可以使用os.listdir(path)直接全部取出來,只需要傳入對(duì)應(yīng)的path即可,這個(gè)比較簡單。
假設(shè)精修圖的路徑是D:\精修圖,則代碼可以這么寫:
import os # 精修圖路徑 trim_catalog = r'D:\精修圖' # 讀取所有文件 trim_files = os.listdir(trim_catalog) print(trim_files)
2.2 源文件夾查找圖片
怎么在源文件查找圖片呢?
有一種方案就是先把源文件夾的 200 張圖片的名稱也讀取出來,然后逐一和精修圖的名稱進(jìn)行匹配,匹配上了就返回。
這是比較常規(guī)的思路,有點(diǎn)像模擬在文件夾中搜索的過程。(示例圖片是 AI 畫的,非實(shí)際操作圖)
這種方案固然可以,但是感覺不夠優(yōu)雅,有沒有更好的方案呢?
下面是我的處理方案:
假設(shè)源文件夾的路徑是D:\源文件夾。
其實(shí)沒有必要去搜索,直接將路徑拼接起來,然后傳遞到后面的環(huán)節(jié)即可。
import os # 精修圖的名稱 trim_file = '1.png' # 源文件夾路徑 src_catalog = r'D:\源文件夾' # 拼接路徑 src_file = os.path.join(src_catalog, trim_file) print(src_file)
這樣可能會(huì)出現(xiàn)一個(gè)問題就是圖片不存在導(dǎo)致拋出異常,不過這沒關(guān)系,既然都能預(yù)料到,那就加一層報(bào)錯(cuò)處理即可(后面說明)。
2.3 將圖片放到指定文件夾
將圖片移動(dòng)到目標(biāo)文件夾,這個(gè)可以通過shutil.move(old_file, new_file)實(shí)現(xiàn)。
了解了這個(gè)庫和函數(shù)之后,就很簡單了。
假設(shè)目標(biāo)存放精修圖的原圖的路徑是D:\源文件夾\目標(biāo)圖,則代碼如下:
import shutil, os # 目標(biāo)目錄 dst_catalog = r'D:\源文件夾\目標(biāo)圖' # 精修圖的名稱 trim_file = '1.png' # 拼接路徑,精修圖原圖新的存放路徑 dst_file = os.path.join(dst_catalog, trim_file) # 移動(dòng)文件,src_file 是精修圖原圖在源文件夾中的存放路徑,在上一小節(jié)(源文件夾查找圖片)中的拼接的路徑 shutil.move(src_file, dst_file)
三、整合并測(cè)試
至此,三段小代碼都完成了,合并起來就是:
注:將trim_file = '1.png'改為trim_file = trim_files[0]
# 獲取精修圖名稱 import os # 精修圖路徑 trim_catalog = r'D:\精修圖' # 讀取所有文件 trim_files = os.listdir(trim_catalog) print(trim_files) # 源文件夾查找圖片 import os # 精修圖的名稱 trim_file = trim_files[0] # 源文件夾路徑 src_catalog = r'D:\源文件夾' # 拼接路徑 src_file = os.path.join(src_catalog, trim_file) print(src_file) # 將圖片放到指定文件夾 import shutil, os # 目標(biāo)目錄 dst_catalog = r'D:\源文件夾\目標(biāo)圖' # 精修圖的名稱 trim_file = trim_files[0] # 拼接路徑,精修圖原圖新的存放路徑 dst_file = os.path.join(dst_catalog, trim_file) # 移動(dòng)文件,src_file 是精修圖原圖在源文件夾中的存放路徑,在上一小節(jié)(源文件夾查找圖片)中的拼接的路徑 shutil.move(src_file, dst_file)
先測(cè)試一下上面的代碼,順利的情況下,以上代碼就可以完成第一張圖片的移動(dòng)任務(wù)了。
那要完成 20 張,就需要對(duì)精修圖進(jìn)行一次遍歷。
加個(gè) for 循環(huán),并將需要循環(huán)執(zhí)行的代碼都整合到循環(huán)中,放到 for 循環(huán)的代碼比較簡單,將拼接和移動(dòng)的代碼放進(jìn)去即可,如下:
import shutil, os # 精修圖路徑 trim_catalog = r'D:\精修圖' # 讀取所有精修圖文件 trim_files = os.listdir(trim_catalog) # 源文件夾路徑 src_catalog = r'D:\源文件夾' # 目標(biāo)目錄 dst_catalog = r'D:\源文件夾\目標(biāo)圖' for trim_file in trim_files: # 拼接路徑,精修圖原圖 舊 的存放路徑 src_file = os.path.join(src_catalog, trim_file) # 拼接路徑,精修圖原圖 新 的存放路徑 dst_file = os.path.join(dst_catalog, trim_file) # 移動(dòng)文件 shutil.move(src_file, dst_file)
理想情況下,以上代碼便可完成任務(wù)了,但是不夠強(qiáng)壯!前面也講到了,可能會(huì)出現(xiàn)圖片不存在等可能報(bào)錯(cuò)的情況,為了避免這種情況,需要加個(gè)try…except…進(jìn)行錯(cuò)誤判斷。
import shutil, os # 精修圖路徑 trim_catalog = r'D:\精修圖' # 讀取所有精修圖文件 trim_files = os.listdir(trim_catalog) # 源文件夾路徑 src_catalog = r'D:\源文件夾' # 目標(biāo)目錄 dst_catalog = r'D:\源文件夾\目標(biāo)圖' for trim_file in trim_files: # 拼接路徑,精修圖原圖 舊 的存放路徑 src_file = os.path.join(src_catalog, trim_file) # 拼接路徑,精修圖原圖 新 的存放路徑 dst_file = os.path.join(dst_catalog, trim_file) try: # 移動(dòng)文件 shutil.move(src_file, dst_file) print('完成 %s 文件的移動(dòng)。' % trim_file) except: print('文件 %s 移動(dòng)失?。。?!' % trim_file)
這樣子可看到哪一些圖片執(zhí)行成功,哪一些執(zhí)行失敗,然后對(duì)執(zhí)行失敗的再進(jìn)行查看是不是文件不存在等情況進(jìn)行處理。但是這樣要一個(gè)個(gè)找,能不能再給一個(gè)報(bào)告之類的呢,再整一下!
import shutil, os # 精修圖路徑 trim_catalog = r'D:\精修圖' # 讀取所有精修圖文件 trim_files = os.listdir(trim_catalog) # 源文件夾路徑 src_catalog = r'D:\源文件夾' # 目標(biāo)目錄 dst_catalog = r'D:\源文件夾\目標(biāo)圖' suc_no = 0 err_no = 0 err_file_name = [] for trim_file in trim_files: # 拼接路徑,精修圖原圖 舊 的存放路徑 src_file = os.path.join(src_catalog, trim_file) # 拼接路徑,精修圖原圖 新 的存放路徑 dst_file = os.path.join(dst_catalog, trim_file) try: # 移動(dòng)文件 shutil.move(src_file, dst_file) print('完成 %s 文件的移動(dòng)。' % trim_file) suc_no += 1 except: print('文件 %s 移動(dòng)失?。。。? % trim_file) err_no += 1 err_file_name.append(trim_file) if err_no>0: print('最終結(jié)果:成功移動(dòng) %s 個(gè)文件,有 %s 個(gè)文件移動(dòng)失敗。失敗文件為 %s。' % (suc_no, err_no, '、'.join(err_file_name))) else: print('最終結(jié)果:成功移動(dòng) %s 個(gè)文件,無失敗任務(wù)。' % suc_no)
代碼寫好了,下面測(cè)試一下:
在【源文件夾】中放 9 張圖片。
然后復(fù)制三張放到【精修圖】(假設(shè)已精修)
運(yùn)行代碼,結(jié)果如下:
下面我把【精修圖】中的 7.png 修改為 7-1.png ,并將移動(dòng)到【目標(biāo)圖】的三張圖重新放回【源文件夾】,再試試效果
執(zhí)行結(jié)果如下:
完美?。?!
四、總結(jié)
本文通過 Python 的 os 和 shutil 庫,使用os.listdir()、os.path.join()、shutil.move()等方法,實(shí)現(xiàn)了將指定的文件從大文件夾中移動(dòng)到目標(biāo)文件夾中。
os.listdir()用于提取指定路徑的文件的名稱;
os.path.join()用于拼接路徑,以便通過絕對(duì)路徑對(duì)文件進(jìn)行移動(dòng);
shutil.move()用于移動(dòng)文件。
到此這篇關(guān)于Python實(shí)現(xiàn)移動(dòng)指定圖片到指定目錄的文章就介紹到這了,更多相關(guān)Python移動(dòng)圖片到指定目錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas DataFrame 交集并集補(bǔ)集的實(shí)現(xiàn)
這篇文章主要介紹了pandas DataFrame 交集并集補(bǔ)集的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06python正則表達(dá)式中匹配次數(shù)與貪心問題詳解(+??*)
正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配,下面這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式中匹配次數(shù)與貪心問題(+??*)的相關(guān)資料,需要的朋友可以參考下2022-10-10python實(shí)現(xiàn)excel公式格式化的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)excel公式格式化的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12手把手教你怎么用Python實(shí)現(xiàn)zip文件密碼的破解
之前在家里的老電腦中,發(fā)現(xiàn)一個(gè)加密zip壓縮包,由于時(shí)隔太久忘記密碼了,依稀記得密碼是6位字母加數(shù)字,網(wǎng)上下載了很多破解密碼的軟件都沒有效果,于是想到自己用Python寫一個(gè)暴力破解密碼的腳本,需要的朋友可以參考下2021-05-05