《自拍教程73》Python 自动生成相册文件夹

案例故事: Python mediainfo批量重命名图片文件,测试图片是批量重命名好了,
但是将测试图片放于一个文件夹相册,图库App并不能显示图片信息,

为了测试的方便性, 需要把图片放到对应的文件夹下,这些文件夹导入手机后,
图库App则就会以相册的形式加载这些文件夹,效果如下:

根据相册名,点击进去就是准确的测试图片文件了,
我们需要根据图片名称,自动化生成相册文件夹。

准备阶段
  1. 为了减少歧义,我们还是建议延用输入输出文件架构。
  2. 预期效果如下, 双击运行auto_folder.py,会在Output_Folder文件夹下自动生成多个“图片格式_图片分辨率” 的子文件夹。

        |   auto_folder.py # 双击运行即可
        |   
        +---Input_Image # 输入,图片文件
        |       BMP_128x128_24bit_bmp.bmp
        |       GIF_240x240_undef_gif.gif
        |       JPEG_320x240_8bit_jpg_1.jpg
        |       JPEG_320x240_8bit_jpg_2.jpg
        |       PNG_500x500_32bit_png.png
        |       
        \---Output_Folder # 输出,自动归类并生成相册文件夹
            +---BMP_128x128
            |       BMP_128x128_24bit_bmp.bmp
            |       
            +---GIF_240x240
            |       GIF_240x240_undef_gif.gif
            |       
            +---JPEG_320x240
            |       JPEG_320x240_8bit_jpg_1.jpg
            |       JPEG_320x240_8bit_jpg_2.jpg
            |       
            \---PNG_500x500
                    PNG_500x500_32bit_png.png


Python批处理脚本形式

记住批处理脚本的精髓:批量顺序执行语句

# coding=utf-8

import os
from shutil import copyfile

curdir = os.getcwd()

# 输入文件夹,放入待文件夹归类的图片
input_image_path = os.path.join(curdir, "Input_Image")
filelist = os.listdir(input_image_path)  # 获取文件列表

# 输出文件夹,已自动归类的文件夹存放在这里
output_folder_path = os.path.join(curdir, "Output_Folder")

# 如果没有Output_Folder这个文件夹,则创建这个文件夹
if not os.path.exists(output_folder_path):
    os.mkdir(output_folder_path)

if filelist:  # 如果文件列表不为空
    for i in filelist:  # 遍历文件列表
        # 第一步,获取文件名称,作为新的文件夹的名字,并创建新文件夹
        tempname_list = i.split("_")  # 文件名按_切片
        new_folder_name = tempname_list[0] + "_" + tempname_list[1]
        new_folder_path = os.path.join(output_folder_path, new_folder_name)
        try:
            os.mkdir(new_folder_path)
        except FileExistsError:  # 如果出现文件夹已经存在的错误,直接忽略,即一个文件夹下可能有多个图片文件。
            pass

        # 第二步, 复制文件
        image_file = os.path.join(input_image_path, i)
        new_image_file = os.path.join(new_folder_path, i)
        copyfile(image_file, new_image_file)
else:
    print("It's a Empty folder, please input the image files which need to be renamed firstly!!!")
    os.system("pause")

Python面向过程函数形式:

把需要反复调用的代码块,封装成一个函数,只预留一定参数输入输出接口。

# coding=utf-8

import os
from shutil import copyfile


def auto_folder(image_path, dest_folder):
    '''根据文件名称,自动归类到对应的文件夹下去'''

    # 第一步,获取文件名称,作为新的文件夹的名字,并创建新文件夹
    image_file = os.path.split(image_path)[-1]
    tempname_list = image_file.split("_")  # 文件名按_切片
    new_folder_name = tempname_list[0] + "_" + tempname_list[1]
    new_folder_path = os.path.join(dest_folder, new_folder_name)
    try:
        os.mkdir(new_folder_path)
    except FileExistsError:  # 如果出现文件夹已经存在的错误,直接忽略,即一个文件夹下可能有多个图片文件。
        pass

    # 第二步, 复制文件
    new_image_path = os.path.join(new_folder_path, image_file)
    copyfile(image_path, new_image_path)


if __name__ == '__main__':
    curdir = os.getcwd()

    # 输入文件夹,放入待文件夹归类的图片
    input_image_path = os.path.join(curdir, "Input_Image")
    filelist = os.listdir(input_image_path)  # 获取文件列表

    # 输出文件夹,已自动归类的文件夹存放在这里
    output_folder_path = os.path.join(curdir, "Output_Folder")

    # 如果没有Output_Folder这个文件夹,则创建这个文件夹
    if not os.path.exists(output_folder_path):
        os.mkdir(output_folder_path)

    if filelist:  # 如果文件列表不为空
        for i in filelist:  # 遍历文件列表
            image_path = os.path.join(input_image_path, i)
            auto_folder(image_path, output_folder_path)
    else:
        print("It's a Empty folder, please input the image files which need to be renamed firstly!!!")
        os.system("pause")

Python面向对象类形式

面向对象类的编程思维应该是这样的:
如果给你一个空白的世界,在这个世界里你需要哪些种类的事物,
这些种类的事物都具备哪些共有的属性与方法,
这些种类(类)的事物(对象),和其他种类(其他类)的事物(其他对象)有什么关系。
尽量把这些类封装好,只暴露对外的属性(变量)和方法(函数)即可。

# coding=utf-8

import os
from shutil import copyfile


class AutoFolder(object):
    def __init__(self, image_path):
        self.image_path = image_path

    def auto_folder(self, dest_folder):
        '''根据文件名称,自动归类到对应的文件夹下去'''

        # 第一步,获取文件名称,作为新的文件夹的名字,并创建新文件夹
        image_file = os.path.split(self.image_path)[-1]
        tempname_list = image_file.split("_")  # 文件名按_切片
        new_folder_name = tempname_list[0] + "_" + tempname_list[1]
        new_folder_path = os.path.join(dest_folder, new_folder_name)
        try:
            os.mkdir(new_folder_path)
        except FileExistsError:  # 如果出现文件夹已经存在的错误,直接忽略,即一个文件夹下可能有多个图片文件。
            pass

        # 第二步, 复制文件
        new_image_path = os.path.join(new_folder_path, image_file)
        copyfile(self.image_path, new_image_path)


if __name__ == '__main__':
    curdir = os.getcwd()

    # 输入文件夹,放入待文件夹归类的图片
    input_image_path = os.path.join(curdir, "Input_Image")
    filelist = os.listdir(input_image_path)  # 获取文件列表

    # 输出文件夹,已自动归类的文件夹存放在这里
    output_folder_path = os.path.join(curdir, "Output_Folder")

    # 如果没有Output_Folder这个文件夹,则创建这个文件夹
    if not os.path.exists(output_folder_path):
        os.mkdir(output_folder_path)

    if filelist:  # 如果文件列表不为空
        for i in filelist:  # 遍历文件列表
            image_path = os.path.join(input_image_path, i)
            a_obj = AutoFolder(image_path)
            a_obj.auto_folder(output_folder_path)
    else:
        print("It's a Empty folder, please input the image files which need to be renamed firstly!!!")
        os.system("pause")

本案例练手素材下载

以上代码的3种实现形式都可以直接运行,比如保存为auto_floder.py,
建议python auto_folder.py运行,当然也可以双击运行。
跳转到自拍教程官网下载


更多更好的原创文章,请访问官方网站:www.zipython.com
自拍教程(自动化测试Python教程,武散人编著)
原文链接:https://www.zipython.com/#/detail?id=281b5094c3864c53bb7284b2a18a3468
也可关注“武散人”微信订阅号,随时接受文章推送。

posted @ 2020-06-23 20:01  zipython  阅读(823)  评论(0编辑  收藏  举报