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