根據輸入的excel檔案地址讀取圖片名稱,遞迴匹配特定目錄下的圖片資訊並整理到指定的目錄下

四季青年發表於2024-11-22
一、此專案是根據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()



相關文章