BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【python・Django】日時情報が入ったファイル名から年・月・日・時間の情報を取り出す

はじめに

こんにちは!
株式会社BFT名古屋支店・インフラ女子(?)のやまぐちです。

pythonなどのプログラミング関係はいつも先人のコピペから組み立てている私。Djangoウェブアプリケーションを作成していく中で、ファイル名に日時が入っているものから年・月・日・時間の情報をそれぞれ取り出してみたので備忘のために記載しています。

最終的に作成するウェブアプリケーションではこの画像ファイル名を指定して新しい順からサムネイルのように並べます。その画像ファイルの下に年月日&時間情報を表示しようと思います。

環境構築の様子はこちらをご覧ください。
bftnagoya.hateblo.jp

日時情報が入ったファイル名から年・月・日・時間の情報を取り出す

前提条件
  • ディレクトリには「yyyymmdd_HHMMSS.jpg」というファイル名が複数配置されている
  • それぞれのファイル名に対して、年月日時間情報をそれぞれ取り出したい

dateコマンドやstatコマンドでファイルの年月日時間情報を取得する方法もありますが、せっかくファイル名に情報があるのでここからコネコネすることにしました。

さっそくやってみましょう

まずはファイルの一覧を取得します。
OSモジュールのlistdir関数を使用してディレクトリとファイルの一覧を取得します。必要なのはファイルだけなので、os.listdir関数の結果を「getdirsfiles」変数に格納した後に「filesonly」変数へファイル名だけ抜き出して入れています。

import os

# ファイルが格納されるディレクトリをpathに指定
path = "/tmp/path/"

getdirsfiles = os.listdir(path=path)
filesonly = [f for f in getdirsfiles if os.path.isfile(os.path.join(path, f))]

ファイル名「yyyymmdd_HHMMSS.jpg」から年月日&時間の情報を取り出すにあたって、不要な"_"と".jpg"を空白で置換します。

# ファイル名は「yyyymmdd_HHMMSS.jpg」として保存される
# "_"や".jpg"を取り除き、int型に変換して降順に並び替え、再度str型に戻す
rm_char_files = [s.replace('_', '') for s in filesonly]
rm_char_files = [s.replace('.jpg', '') for s in rm_char_files]

「yyyymmddHHMMSS」となった文字列を数字に変換した上で降順に並び替えます。これは最終的に新しいファイルからウェブアプリケーションに表示するための処理です。
並び替えた上で再度文字列に変換し直します。

to_int_filename = [int(i) for i in rm_char_files]
dsc_to_int_filename = sorted(to_int_filename, reverse=True)
dsc_to_str_filename = [str(s) for s in dsc_to_int_filename]

最後に「yyyymmddHHMMSS」からそれぞれ年月日&時間を取りだしていきます。x[N1:N2]の部分は文字列を左から0としてカウントし、N1に開始文字番号、N2に終了文字番号+1を指定します。最初はN2の終了文字番号+1がわかりにくかったのですが、"未満"と考えるとすんなり理解ができそうです。

また、ファイル名を「filename」として再度組み立てていますが、これはこの後ファイル名を指定して画像を表示するためです。

fixed_filelist = []

# fixed_filelistに、1-ファイル名、2-年、3-月、4-日、5-時、6-分、7-秒を格納
for x in dsc_to_str_filename:
   yyyy = x[0:4]
   mm = x[4:6]
   dd = x[6:8]
   hh = x[8:10]
   min = x[10:12]
   sec = x[12:14]

   filename = yyyy + mm + dd  + '_' + hh + min + sec + '.jpg'
   fixed_filelist.append([filename, yyyy, mm, dd, hh, min, sec])

これで配列「fixed_filelist」に指定ディレクトリ配下のファイルたちがそれぞれ、ファイル名、年、月、日、時、分、秒と格納されることになりました。

表示する画像に取得した日時情報を付けるなら「yyyy年mm月dd日 HH:MM」として渡してもよかったなぁなどと思いつつ。HTML側で細かく変更するかもしれない可能性を考えて別々に数値の情報のみ変数に格納することにしました。

終わりに

今回はDjangoで作成したウェブアプリケーションのviews.pyに記載した「ファイル一覧から年月日&時間情報を取り出す」部分を抜き出して記載しました!

この取り出した情報が格納されている配列「fixed_filelist」をどうHTML側に渡していくのかは以下の記事を参照ください。

ここまで読んでいただきありがとうございました~ ^ ^