Pythonで動画を「メディアの作成日時」にリネームする
iPhoneで撮った動画のファイル名 IMG_0000.MOV を、「メディアの作成日時」から取得した YYYYMMDD_hhnn.MOV に変更したいなって思って作ったコードです。
経緯
最近は動画がとってもかんたんに残せるけれど全部高画質で残しておいたらストレージがいくらあっても足りないので、年末に1年分のデータを整理して、そこそこ見れる画質にリサイズする作業を毎年やっています。で、リサイズする前にファイル名を「いつ撮られたものか」がわかる名前にしておきたくて。「更新日時」だったらわりとかんたんに取り出せるもののズレてることもあるので、「メディアの作成日時」を使いたい。
前にExcelのVBAで作ったこともあるんですが、勉強がてらPythonでもやってみようかなと思って書きました。
参考
ありがとうございます!
- pywin32によりPythonからWin32 APIにアクセスする | ジコログ
- PythonでWindows ファイルの拡張プロパティを読み書きする-たのじぃの書き捨てノート
- Python小技:文字列から特定の文字コードに含まれない文字を削除する #Python – Qiita
pywin32のインストール
VBAでやったときと同じようにGetDetailsOfでファイルのプロパティを取得すれば良さそう。で、それにはpywin32ライブラリが必要みたいなので、まずはインストールから。Win+R → cmd でコマンドプロンプトを起動して、
このコマンドでインストール済パッケージと、バージョンが確認。
pip list
このコマンドでいったん pip をアップデートしてから、
python -m pip install --upgrade pip
このコマンドでインストール。
pip install pywin32
もう一度インストール済パッケージと、バージョンの確認をすると、インストールしたパッケージが増えている。
pip list
目当ての番号を調べる
私の環境(Win11)なら「メディアの作成日時」は 208 のはずなんだけれど、一応確認しておく。
import os import win32com.client folderName = r'C:\Sample' # 調べたいファイルが入っているフォルダ fileName = 'test.MOV' # 調べたいファイル名 shell = win32com.client.Dispatch('Shell.Application') fol = shell.NameSpace(folderName) for file in fol.Items(): if str(file) == fileName: for i in range(1, 350): propertyName = fol.GetDetailsOf('', i) # プロパティ名の取得 content = fol.GetDetailsOf(fol.ParseName(file.Name), i) # 内容の取得 print(str(i) + '\t' + propertyName + '\t' + content) # 番号, プロパティ名, 内容 を出力
上のコードを実行すると、ターミナルにそのファイルのプロパティ一覧が出力されます。
「メディアの作成日時」は、 208 でした。
ファイルをリネームする
こちらが、指定のフォルダ内の動画を「メディアの作成日時」から取得した YYYYMMDD_hhnn にリネームするコード。
import os import win32com.client path = r'C:\Sample' # 動画の入っているフォルダ shell = win32com.client.Dispatch('Shell.Application') fol = shell.NameSpace(path) print('result:') for file in fol.Items(): beforeName = str(file) # 元のファイル名を取得 fileName, ext = os.path.splitext(beforeName) # ファイル名と拡張子を分割 if not(ext == '.mp4' or ext == '.MOV'): # 指定の拡張子じゃなかったら print('NG: ' + beforeName + ' は指定された動画形式ではありません') # 失敗 continue # ループをスキップ tmp = fol.GetDetailsOf(file, 208) # メディアの作成日時を取得 tmp = tmp.encode('cp932', errors='ignore').decode('cp932') # 認識できない文字を削除 if tmp == '': # メディアの作成日時が存在しなければ print('NG: ' + beforeName + ' → Null') # 失敗 continue # ループをスキップ d, t = tmp.split(' ') # 日付と時間を分割 d = d.replace('/', '') # 日付の/を削除 t = t.replace(':', '') # 時間の:を削除 if len(t) == 3: # 時間の桁が足りなかったら t = '0' + t # 頭に0を付ける afterName = d + '_' + t + ext # 変更後のファイル名を生成 # リネーム try: os.rename(path + '/' + beforeName, path + '/' + afterName) # 実行 print('OK: ' + beforeName + ' → ' + afterName) # 成功 except FileExistsError: print('NG: ' + beforeName + ' → ' + afterName) # 同名があったら失敗
実行すると、4行目で指定したフォルダ内の動画ファイルをリネームして、ターミナルに結果が出力されます。
拡張子が .mp4 または .MOV でなかった場合は処理しません(12~14行目)。「メディアの作成日時」が存在しないときも処理しません(17~19行目)。
VBAで作ったときにも同じ現象があったのですが、どうやら「メディアの作成日時」は認識できない文字コードが含まれているようです。ですので、それを16行目で削除しています。
ファイルに手を加えるので、実行の際はバックアップしっかり&自己責任でお願いします。
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。