EnsekiTT Blog

EnsekiTTが書くブログです。

Pythonでタイムスタンプをつけるときのメモと同じ時間のときに通し番号をつける話

つまりなにしたの?

Pythonで実行時のタイムスタンプを名前につけて出力ファイルを保存したりするけど、
いつも同じタイムスタンプをつけているので、Blogにもメモしておくことにした。
ただタイムスタンプをつけるだけだと同じ時間だったときに競合するので、
時間がかぶってたら通し番号をつけるようにもしている。

f:id:ensekitt:20190112124444j:plain
Pythonでタイムスタンプをつけるときのメモと同じ時間のときに通し番号をつける話
*1

どんなタイムスタンプをつけているのか

YYYYMMDD_hhmmss_nnn_ファイル名
nnnは同じ秒数にファイルが発生する可能性がある場合に何桁か通し番号を付けている。
今回は前半のYYYYMMDD_hhmmssを作成することにする。

コード

from datetime import datetime
time_stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
print(time_stamp)

'20180912_191513'

通し番号をつけるようにする

nnnの通し番号を同じ秒数のときだけインクリメントする。
イメージとしては
20180912_191513_000
20180912_191513_001
20180912_191513_002
20180912_191513_003
20180912_191514_000
20180912_191514_001
20180912_191515_000
...
みたいな感じにしたいとする。

1つ前の時間(秒まで)と今の時間(秒まで)の比較を行って、
同じだったらnnnをインクリメントすれば良い。
違ったらnnnを0に戻せれば良い。

コード

def get_timestamp():
  last_time_stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  count = -1
  while True:
    temp_time_stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    if temp_time_stamp == last_time_stamp:
      count += 1
    else:
      count = 0
    last_time_stamp = temp_time_stamp
    yield temp_time_stamp+"_"+"{:03d}".format(count)

こんな関数を作ってみた。

>>> g = get_timestamp()
>>> next(g)
20180912_191513_000
>>> next(g)
20180912_191513_001
>>> next(g)
20180912_191513_002
>>> next(g)
20180912_191513_003
>>> next(g)
20180912_191514_000
>>> next(g)
20180912_191514_001
>>> next(g)
20180912_191515_000

すばやくやるとこんな感じの出力が出せる。
秒までいらないけど同じ分に複数回きちゃうかもって時もこういうのを採用しておくと楽。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。