みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
プログラミング初心者&Windowsユーザー向けにPythonでフォルダ圧縮ツールを作る方法をお伝えしています。
前回の記事はコチラでした。
フォルダ配下を全てZIP圧縮する方法をお伝えしました。
さて、前回作ったツールなのですが、動作させるたびに上書きでZIPファイルを生成する仕組みになっています。
ただ、過去のZIPファイルを残しておきたい場合ありますよね?
そんな時のテクニックとして、例えば「test_20170910.zip」というふうに、ZIPファイル名に本日の日付を入れておけば、過去分を日単位で残しておけるということになります。
ということで、今回はPythonで現在の日時を取得して文字列に変換する方法についてお伝えします。
では、行ってみましょう!
日付を取り扱うdatetimeモジュール
Pythonで日時を取り扱う場合は、datetimeモジュールを使います。
標準ライブラリに含まれていますので、スクリプトの冒頭でインポートすれば使用することができます。
datetimeモジュールでは、日時についていくつかの種類のデータ型を利用することができますが、代表的なものとして以下のようなものがあります。
クラス | 説明 |
---|---|
date | 日付 |
time | 時刻 |
datetime | 日時と時刻 |
timedelta | 経過時間 |
今回は、年月日つまり日付が利用できれば良いので、dateクラスまたはdatetimeクラスを利用することになります。
以降、大は小を兼ねる的にdatetimeクラスを使いますが、その場合のメソッドの記述方法としては、モジュール名のdatetime、クラス名のdatetime、そしてメソッドをピリオドでつないで以下のようになります。
now関数で現在の日時を取得する
現在の日時を取得するには、datetime.datetime.now関数を使います。
書式はまんまで、以下の通りです。
これを実行すると、現在の日時をdatetimeオブジェクトという形式で生成することができます。
試しに以下のようなスクリプトを実行してみましょう。
import datetime
now = datetime.datetime.now()
print(now) #2017-09-10 22:08:41.814136
Shellウィンドウに現在の時刻がマイクロ秒の単位まで出力されたことと思います。
datetimeオブジェクトは文字列連結できません
ですが、これを元に「test_20170910.zip」というようなファイル名を生成すべく、以下のようなスクリプトを実行すると
import datetime
now = datetime.datetime.now()
print('test_' + now)
以下エラーが発生してしまいます。
TypeError: must be str, not datetime.datetime
strつまり文字列じゃないとダメよ、ということですね。
日時を文字列に変換する
str関数でdatetimeオブジェクトを文字列に変換
str関数を使えば、datetimeオブジェクトを文字列に変換することができます。
例えば、以下のスクリプトですね。
import datetime
now = datetime.datetime.now()
print('test_' + str(now)) #test_2017-09-10 22:13:47.289211
まあ、いいっちゃいいんえすけど、時、分、秒ましてやマイクロ秒までは不要ですね。
formatメソッドでdatetimeオブジェクトを文字列に変換
そこで、以前もお伝えしたformatメソッドを使う方法があります。
formatメソッドは対象となる文字列の指定の位置に引数の値を差し込むというものですが、引数をdatetimeオブジェクトとした場合に年、月、日などをいい感じに文字列の中に埋め込むこともできます。
例を見たほうが速いので、こちらのスクリプトをご覧ください。
import datetime
now = datetime.datetime.now()
print('test_{0:%Y%m%d}'.format(now)) #test_20170910
ファイル名として欲しい文字列が出てきました。
formatメソッドの対象とする文字列に、以下のコードを仕込むことで、その位置に指定の値を差し込むことができるようになります。
コード | 説明 |
---|---|
%d | 2桁の日 |
%m | 2桁の月 |
%y | 2桁の年 |
%Y | 4桁の年 |
%H | 24時間表記の時 |
%I | 12時間表記の時 |
%p | AMまたはPM |
%M | 2桁の分 |
%S | 2桁の秒 |
%f | 6桁のマイクロ秒 |
ZIPファイル名に年月日を使用する
以上を踏まえて、フォルダのZIP圧縮ツールのファイル名に年月日を加えてみました。
こちらのスクリプトです。
import os, zipfile, datetime
now = datetime.datetime.now()
zipname = 'test_{0:%Y%m%d}.zip'.format(now)
with zipfile.ZipFile(zipname,'w') as myzip:
for folder, subfolders, files in os.walk('test'):
myzip.write(folder)
for file in files:
myzip.write(folder + "\\" + file)
実行をすると、以下のように本日の日付でZIPファイルが作成されます。
まとめ
以上、Pythonで現在の日時を取得して、指定のフォーマットの文字列に変換する方法をお伝えしました。
datetimeモジュールと、datetimeオブジェクト、now関数の使い方、formatメソッドによる文字列の変換など使いどころいっぱいのテクニックかなと思います。
さて、次回ですが、古いファイルを削除するために、ファイルの作成日時を求めてみたいと思います。
どうぞお楽しみに!