torinaブログ

DjangoとBootstrap4で作成したブログ
Python, Django, Kivy, Bootstrap, Apache等のメモです
ソースコード

Pythonで、画像の整理

Python Python標準ライブラリ
約278日前 2016年5月25日2:25

このような、A、B、Cというフォルダがあり、それぞれ
A1.png、A2.png、A3.png...
B1.png、B2.png、B3.png...
C1.png、C2.png、C3.png...
とあり、これらの画像をまとめてDフォルダに格納したいと思います。
Dには連番で保存され、A、B、Cフォルダ全部で9毎だった場合はD1.png~D9.pngになるようにします。

コードは以下のようになります。
import os
import shutil
 
 
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
READ_FOLDER = ("A", "B", "C")
WRITE_FOLDER = "D"
EXTENSION = "jpg"
 
 
def write_file(read_path, write_index):
    """ ファイルをコピーする """
 
    file_name = "{0}{1}.{2}".format(
        WRITE_FOLDER, str(write_index), EXTENSION)
    write_path = os.path.join(BASE_DIR, WRITE_FOLDER, file_name)
    shutil.copy(read_path, write_path)
 
 
def get_file(folder_name, read_index):
    """ ファイルパスを返す """
 
    file_name = "{0}{1}.{2}".format(
        folder_name, str(read_index), EXTENSION)
    read_path = os.path.join(BASE_DIR, folder_name, file_name)
    return read_path
 
 
def main():
 
    write_index = 1
    for folder_name in READ_FOLDER:
 
        read_index = 1
        while True:
            read_path = get_file(folder_name, read_index)
            try:
                write_file(read_path, write_index)
            except FileNotFoundError:
                break
            else:
                write_index += 1
                read_index += 1
 
 
if __name__ == "__main__":
    main()



フォルダの中身は、例えば以下のような状態です。
Aフォルダ


Bフォルダ


Cフォルダ



実行後、ちゃんと全て入りました。



以下、試しにジェネレータを使って書いてみたコードです。動作は同じです。
read_indexやwrite_indexがそれぞれの関数内に置けるため、全体的な見通しがよくなっていますね。
import os
import shutil
 
 
READ_FOLDER = ("A", "B", "C")
WRITE_FOLDER = "D"
EXTENSION = "jpg"
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
 
 
def write_file():
    """ ファイルをコピーする """
 
    write_index = 1
    while True:
        read_path = yield
        file_name = "{0}{1}.{2}".format(
            WRITE_FOLDER, str(write_index), EXTENSION)
        write_path = os.path.join(BASE_DIR, WRITE_FOLDER, file_name)
        shutil.copy(read_path, write_path)
        write_index += 1
 
 
def get_file(folder_name):
    """ ファイルパスを返す """
 
    read_index = 1
    while True:
        file_name = "{0}{1}.{2}".format(
            folder_name, str(read_index), EXTENSION)
        read_path = os.path.join(BASE_DIR, folder_name, file_name)
 
        #  ファイルが存在すればファイルパスを返す
        if os.path.exists(read_path):
            yield read_path
            read_index += 1
        else:
            break
 
 
def main():
 
    writer = write_file()
    next(writer)
    for folder_name in READ_FOLDER:
        for read_path in get_file(folder_name):
            writer.send(read_path)
 
 
if __name__ == "__main__":
    main()