Python 图片管理工具介绍(筛像素+从文件夹取出图片并放到文件夹内+excel读取)

发布时间 2023-10-07 19:12:07作者: 不上火星不改名

功能介绍:

这是一个Python脚本工具,用于批量管理和复制图片。其主要功能如下:

  1. 从Excel表格读取数据:程序使用openpyxl库从Excel文件中读取数据,其中A列包含源图片的路径(可以有多个路径,用逗号分隔),B列包含目标目录。

  2. 图片筛选:仅复制最小维度大于800像素的图片,这可以确保目标目录中的图片具有一定的质量。

  3. 智能重命名:在复制过程中,图片会根据其所在的上一级文件夹名称进行重命名,以避免名称冲突。如果目标目录中存在同名文件,程序会自动重命名为“filename(1).jpg/png”、“filename(2).jpg/png”等。

  4. 进度汇报:程序在复制图片时会在控制台显示当前的复制进度。

完成的事情:

  • 程序会遍历Excel表中的所有行,并对每一行执行复制操作。

  • 每次复制操作,程序都会检查源目录下的所有.jpg.png文件,筛选出最小维度大于800像素的图片,并将其复制到目标目录。

  • 在复制过程中,所有图片都会根据其上一级文件夹的名称进行重命名。

使用注意事项:

  1. Excel文件格式:确保提供的Excel文件为.xlsx或.xlsm格式。

  2. 文件路径:在Excel文件中列出的路径不应包含额外的引号。程序已配置为处理这些情况,但为了保持数据的整洁和准确,请避免这样做。

  3. 文件访问权限:确保脚本具有读取源目录和写入目标目录的权限。

  4. 文件完整性:确保要复制的图片没有损坏并且可以正常打开。

  5. 所需库:在使用此工具之前,确保已安装openpyxlPillow库。你可以使用pip install openpyxl Pillow命令进行安装。

附件的格式:

附带的Excel文件应该有以下格式:

  • A列:源图片路径。可以是多个路径,使用逗号,分隔。

  • B列:目标目录,即图片复制的位置。


  • import os
    import shutil
    from openpyxl import load_workbook
    from PIL import Image, UnidentifiedImageError

    def 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 False

    def 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 += 1

    shutil.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()