功能介绍:
这是一个Python脚本工具,用于批量管理和复制图片。其主要功能如下:
-
从Excel表格读取数据:程序使用
openpyxl
库从Excel文件中读取数据,其中A列包含源图片的路径(可以有多个路径,用逗号分隔),B列包含目标目录。 -
图片筛选:仅复制最小维度大于800像素的图片,这可以确保目标目录中的图片具有一定的质量。
-
智能重命名:在复制过程中,图片会根据其所在的上一级文件夹名称进行重命名,以避免名称冲突。如果目标目录中存在同名文件,程序会自动重命名为“filename(1).jpg/png”、“filename(2).jpg/png”等。
-
进度汇报:程序在复制图片时会在控制台显示当前的复制进度。
完成的事情:
-
程序会遍历Excel表中的所有行,并对每一行执行复制操作。
-
每次复制操作,程序都会检查源目录下的所有
.jpg
和.png
文件,筛选出最小维度大于800像素的图片,并将其复制到目标目录。 -
在复制过程中,所有图片都会根据其上一级文件夹的名称进行重命名。
使用注意事项:
-
Excel文件格式:确保提供的Excel文件为.xlsx或.xlsm格式。
-
文件路径:在Excel文件中列出的路径不应包含额外的引号。程序已配置为处理这些情况,但为了保持数据的整洁和准确,请避免这样做。
-
文件访问权限:确保脚本具有读取源目录和写入目标目录的权限。
-
文件完整性:确保要复制的图片没有损坏并且可以正常打开。
-
所需库:在使用此工具之前,确保已安装
openpyxl
和Pillow
库。你可以使用pip install openpyxl Pillow
命令进行安装。
附件的格式:
附带的Excel文件应该有以下格式:
-
A列:源图片路径。可以是多个路径,使用逗号
,
分隔。 -
B列:目标目录,即图片复制的位置。
-
import os
import shutil
from openpyxl import load_workbook
from PIL import Image, UnidentifiedImageErrordef is_large_enough(image_path):
"""检查图片的最小维度是否大于800像素"""
try:
with Image.open(image_path) as img:
width, height = img.size
return min(width, height) > 800
except (UnidentifiedImageError, IOError) as e:
print(f"警告: 无法处理图像 {image_path} - {e}")
return Falsedef copy_images(src_dirs, dst_dir):
total_files = 0
copied_files = 0
for src_dir in src_dirs:
src_dir = src_dir.strip().strip('"')
try:
# 计算总的文件数量,用于进度报告
for _, _, filenames in os.walk(src_dir):
total_files += sum(1 for filename in filenames if filename.endswith(('.png', '.jpg')))
for foldername, subfolders, filenames in os.walk(src_dir):
for filename in filenames:
if filename.endswith('.png') or filename.endswith('.jpg'):
src_path = os.path.join(foldername, filename)
if is_large_enough(src_path):
# 使用上一级文件夹名称重命名图片
parent_folder_name = os.path.basename(foldername)
new_name = parent_folder_name + os.path.splitext(filename)[1]
dst_path = os.path.join(dst_dir, new_name)# 如果目标路径存在同名文件,改变文件名避免覆盖
counter = 1
while os.path.exists(dst_path):
name, ext = os.path.splitext(new_name)
dst_path = os.path.join(dst_dir, f"{name}({counter}){ext}")
counter += 1shutil.copy2(src_path, dst_path)
copied_files += 1# 输出进度
print(f"进度: {copied_files}/{total_files} 已复制")
except Exception as e:
print(f"警告: 无法复制从 {src_dir} 到 {dst_dir} - {e}")def main():
try:
excel_path = input("请输入Excel表地址: ").strip('"')
# 加载excel文件
wb = load_workbook(excel_path)
sheet = wb.active# 遍历每行数据
for row in sheet.iter_rows(min_row=1, values_only=True):
source_dirs = [x.strip('"') for x in row[0].split(",")]
target_dir = row[1].strip('"')
copy_images(source_dirs, target_dir)
print("图片复制完成!")
except Exception as e:
print(f"发生错误: {e}")if __name__ == '__main__':
main()