《自拍教程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
也可關注“武散人”微信訂閱號,隨時接受文章推送。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章