[Python] 久しぶりにpythonスクリプトを作成した。[ファイル区分けスクリプト]

概要

About

ストレージから移したファイル区分けのために久しぶりにPythonスクリプトを組んだ。
忘備録ついでに記したい。

Pythonは自由度が高いし
IDEでの補完機能が弱い(動的型付けなので仕方ないが)ことを除けば、
扱っていて楽しい言語だと思う。

環境

  • Windows10
  • Python 3.7.3

用途

10000個程度ある画像ファイルを名前順でソートして別のフォルダにコピーする。
移す際にサブフォルダを作成し、数百個ずつくらいの組にして仕分けする。

各画像ファイルのファイル名が1.jpg~12000.jpg(.png or .mov)などで規則的だったので
名前順でソートすることにした。

コード

 1# FileName:fileSorting.py
 2import glob
 3import os
 4import shutil
 5from win10toast import ToastNotifier
 6
 7
 8def Main():
 9    isSuccess = True
10
11    try:
12        mySrcPath = r"C:\tmp\20210211\src"
13        myDestpath = r"C:\tmp\20210211\dst"
14        movedFileList = []
15
16        # 指定フォルダ直下のすべてのファイルをListに取得
17        # ファイルの名前(6桁ゼロ埋め)でソート
18        if os.path.isdir(mySrcPath):
19            for file in sorted(
20                    glob.glob(mySrcPath + '\\*', recursive=False),
21                    key=lambda my_file: os.path.splitext(os.path.basename(my_file))[0].zfill(6)
22            ):
23
24                if os.path.isfile(file):
25                    movedFileList.append(file)
26        else:
27            print('No Directory')
28            exit(0)
29
30        currentDirNum = 1
31        # 200個ずつ区分け
32        bundleNum = 200
33        imgNum = len(movedFileList)
34        stt = 1
35        end = 0
36
37        # currentDirNumの番号通りの名前のサブフォルダを作成し、bundleNum個ずつファイルをコピーして格納する
38        while imgNum >= bundleNum:
39            end += bundleNum
40            newList = movedFileList[stt - 1:end]
41            stt += bundleNum
42            dst = myDestpath + "\\" + str(currentDirNum)
43            os.makedirs(dst)
44            currentDirNum += 1
45            # # 指定出力先フォルダにコピー
46            [shutil.copy2(os.path.abspath(file2), dst) for file2 in newList]
47            imgNum -= bundleNum
48        # 残余分のファイルをコピー
49        newList = movedFileList[end:]
50        if newList:
51            dst = myDestpath + "\\" + str(currentDirNum)
52            os.makedirs(dst)
53            [shutil.copy2(os.path.abspath(file2), dst) for file2 in newList]
54
55    except:
56        isSuccess = False
57
58    finally:
59        toast = ToastNotifier()
60        if isSuccess:
61            toast.show_toast("処理完了",
62                             "ファイルまとめが完了しました。",
63                             icon_path=None,
64                             duration=2,
65                             threaded=True)
66        else:
67            toast.show_toast("処理エラー",
68                             "正常に終了しませんでした。",
69                             icon_path=None,
70                             duration=2,
71                             threaded=True)
72
73
74if __name__ == '__main__':
75    Main()
76
comments powered by Disqus