根据输入的excel文件地址读取图片名称,递归匹配特定目录下的图片信息并整理到指定的目录下

一、此项目是根据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()

 



posted @ 2024-11-22 17:51  四季青年  阅读(77)  评论(0)    收藏  举报