一、此專案是根據excel中的圖片名稱,檢索電腦某一個目錄下的所有能匹配到的檔名稱,並整理到同一個資料夾中
1、專案安裝:
此專案外部依賴包
pandas 2.0.3
numpy 1.24.3
內部依賴
import os,sys,time
import glob
import fnmatch
import shutil
2、執行命令:
python3 search_image_name.py 【執行型別:copy、move、clearRuntime】
事例:
複製檔案(把目標檔案複製到新的目錄中):
python3 search_image_name.py
或
python3 search_image_name.py copy
移動檔案(把目標檔案移動到新的目錄中):
python3 search_image_name.py move
清空快取(清空專案下runtime快取目錄,慎重操作):
python3 search_image_name.py clearRuntime
3、專案目錄說明:
ry_tool_001
File 預設excel目錄
photo_name.xlsx 預設excel檔案,如果用預設,名字必須一致
Image 預設搜尋圖片的目標測試目錄
runtime 整理後的圖片目標儲存目錄
README.md 說明文件
search_image_name.py 指令碼
4、細節說明:
1、excel檔案第一行標題無法讀取,檔名必須列排序,詳細參考File下的photo_name.xlsx檔案
2、excel檔案中的圖片名可以帶字尾也可以不帶字尾,帶字尾精確匹配,不帶字尾模糊匹配
3、命令字尾引數分為兩類,複製(copy)和移動(move),可以隨意選擇
4、執行完畢如果覺得有錯誤,請先刪除runtime下的圖片整理檔案,防止錯誤重複,使用清空快取命令即可
5、輸入引數介紹:
請輸入您需要查詢的excel檔案地址:
請儘量輸入需要搜尋的excel檔案的絕對路徑
如:/Users/python/tool/ry_tool_001/File/photo_name.xlsx
請輸入您需要查詢圖片的目錄地址:
請儘量輸入需要查詢圖片目錄的絕對路徑
如:/Users/python/tool/ry_tool_001/Image/
請輸入您要儲存圖片的目錄地址:
請儘量輸入需要儲存圖片目錄的絕對路徑
如:/Users/python/tool/ry_tool_001/runtime/
5、實現程式碼
import pandas as pd import numpy as np import os import sys import time import glob import fnmatch import shutil def clear_runtime(): """ 清除快取目錄下的檔案資訊 :return: """ base_dir = os.path.dirname(os.path.abspath(__file__)) # 專案根目錄 do_clear_path = base_dir + '/' + os.path.join("runtime/" + time.strftime('%Y%m%d')) print('''clear %s''' % (do_clear_path)) shutil.rmtree(do_clear_path) os.mkdir(do_clear_path) def read_excel(file): """ 讀取excel檔案 :param file: 預設檔案 ./File/photo_name.xlsx :return: """ re = pd.read_excel(file) return np.array(re.iloc[0:, 0]) def create_directory(directory_path): """ 建立目錄 :param directory_path: :return: """ if not os.path.exists(directory_path): os.makedirs(directory_path) return True def get_file_rule(filename): """ 獲取檔名稱匹配規則 :param filename: 檔名稱 :return: # 精準匹配名稱:f"{img_name}" # 模糊匹配名稱:f"*{img_name}*.jpg" # 匹配名稱相同字尾不同:f"{img_name}.*" # 匹配名稱和字尾都相同:f"{img_name}.jpg" """ if "." in filename: return f"{filename}" else: return f"{filename}.*" def depth_search_image(read_dir, img_name): """ 遞迴遍歷所有目錄下能匹配到的檔案, 此方法暫未使用,如果需要檢索目錄下所有的同名檔案時,可以遍歷此方法進行批次獲取 :param read_dir: :param img_name: :return(string): 返回檔案所在路徑,事例: ./Image/photo1.jpg ./Image/ccc/photo1.jpg ./Image/aaa/bbb/photo1.jpg """ for root, dirs, files in os.walk(read_dir): for file in fnmatch.filter(files, get_file_rule(img_name)): yield os.path.join(root, file) def search_image(read_dir, img_name): """ 根據檔名,遞迴匹配當前目錄下的檔名稱,如果匹配到第一個自動返回 :param read_dir: 匹配的目標目錄 :param img_name: 匹配的檔名稱 :return(array):['./Image/aaa/photo3.jpg'] """ for root, dirs, files in os.walk(read_dir): # 構建用於匹配圖片檔案的模式 pattern = os.path.join(root, get_file_rule(img_name)) # 使用glob模組進行模式匹配 matches = glob.glob(pattern, recursive=True) if matches: return matches[0] return [] def get_put_info(put_type, put_info, error_msg, path): """ 輸入檔案或目錄規則校驗校驗 :param put_type: 1 校驗檔案 2 校驗目錄 3 建立目錄 :param put_info: 輸入資訊提示語 :param error_msg: 錯誤資訊提示語 :param path: 預設地址檔案或者目錄 :return: """ while True: pathinfo = input(put_info) if pathinfo.lower() in ("exit", "quit", "q"): exit() if pathinfo == '': pathinfo = path if put_type == 1: if not os.path.isfile(pathinfo) or not os.path.exists(pathinfo): print(error_msg) continue elif put_type == 2: if not os.path.isdir(pathinfo) or not os.path.exists(pathinfo): print(error_msg) continue elif put_type == 3: # 如果目錄不存在,直接建立目錄 create_directory(pathinfo) break return pathinfo def run(): """ 根據excel檔名,整理某一個目錄下的所有檔案 複製檔案:python3 search_image_name.py copy 移動檔案:python3 search_image_name.py move :return: """ # 模組名和要引入的物件名 params = sys.argv if len(params) > 1: if params[1] == 'clearRuntime': clear_runtime() exit() file_type = 'move' if len(params) > 1 and params[1] == 'move' else 'copy' excel_path = get_put_info(1, "請輸入您需要查詢的excel檔案地址:", "檔案不存在請重新輸入", './File/photo_name.xlsx') read_dir_path = get_put_info(2, "請輸入您需要查詢圖片的目錄地址:", "目錄不存在請重新輸入", './Image/') write_dir_path = get_put_info(3, "請輸入您要儲存圖片的目錄地址:", "目錄不存在建立目錄", './runtime/' + time.strftime('%Y%m%d') + '/') image_name_data = read_excel(excel_path) for name in image_name_data: image_path = search_image(read_dir_path, name) if image_path: if file_type == 'move': shutil.move(image_path, write_dir_path) else: shutil.copy(image_path, write_dir_path) if __name__ == '__main__': run()