「この2つのファイルはどっちが古いのか知りたい」
Pythonでファイルの作成日や更新日を取得したい場合があります。
フォルダの中の古いファイルを削除したり、最近アクセスしたファイルを選別したり。
Pythonにはファイルの作成日時を取得する機能があるので、年月日形式に変換する方法と合わせて紹介します。
|
[g_ad_double_dmm_eng]
ファイルの作成・更新・アクセス日時
Pythonでファイルの日時を取得するには
os モジュール を使用します。
ファイルの作成日時を取得
ファイルを作成した日時を取得する場合は
getctime()
の関数を使います。
import os
filePath = "ファイルパス"
print(os.path.getctime(filePath))
実行:
ファイルの作成日時を出力しました。
エポック秒
ファイルの作成日時を取得する事はできたみたいですが、出力された値が数字の羅列でよくわかりません。
Pythonで取得されたこの数字の羅列は
エポック秒
と言います。
エポック秒とは「UNIX時間」の事
UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。UNIXエポック、すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数(すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの)として表される。GPS時刻などとは異なり、大多数のシステムでは、本当の経過秒数を表すものではない
Wikipedia
つまり1970年1月1日午前0時0分0秒からの経過秒数 を表します。
“数字が小さければ古いし、数字が大きければ新しい” のでファイルの日付を比較するのは簡単にできます。
ファイルの更新日時を取得
ファイルを更新した日時を取得する場合は
getmtime()
の関数を使います。
import os
filePath = "ファイルパス"
print(os.path.getmtime(filePath))
実行:
更新日時をエポック秒で出力しました。
ファイルのアクセス日時を取得
ファイルにアクセスした日時を取得する場合は
getatime()
の関数を使います。
import os
filePath = "ファイルパス"
print(os.path.getatime(filePath))
実行:
アクセス日時をエポック秒で出力しました。
|
年月日形式表示変換
ファイルの作成日時の比較など、取得したエポック日時を計算の値として使用するなら問題は無いのですが、取得した日時をツール等に表示するのが目的である場合は、年月日形式に表示を変換する必要があります。
Pythonでエポック秒を年月日形式に変換するには
time モジュール と datetime モジュール
を使います。
※これ以外に時刻に関連するモジュール”calendar”があります。
ローカル時間
エポック秒から年月日形式に表示を変換する場合はローカル時間と協定世界時 (Coordinated Universal Time)のどちらかを選択します。
timeモジュールを使ってエポック秒からローカル時間に変換する場合は
time.localetime() 関数を使用します。
import time
filePath = "ファイルパス"
print(time.localtime(os.path.getctime(filePath)))
実行:
ローカル時間がtime.struct_time 時刻値シーケンスの型 で返されました。
時刻値シーケンスの型は以下の値があります。
インデックス | 属性 | 値 |
0 | tm_year | 年: 2019 など |
1 | tm_mon | 月:1から12 |
2 | tm_mday | 日:1から31 |
3 | tm_hour | 時:0から23 |
4 | tm_min | 分:0から59 |
5 | tm_sec | 秒:値の幅は 0 から 61。60はうるう秒※1 |
6 | tm_wday | 曜日:月曜日が0 [0,6] の間の数 |
7 | tm_yday | 年の日数:[1,366] の間の数 |
8 | tm_isdst | 夏時間のフラグ:0,1 又は不明の場合-1 |
N/A | tm_zone | タイムゾーンの短縮名 |
N/A | tm_gmtoff | 協定世界時UTC から東方向へのオフセット (秒) |
※1.
値の幅は実際に 0 から 61 です; 60 は うるう秒<leap seconds> を表し、 61 は歴史的理由によりサポートされています。
Pythonドキュメント
協定世界時 (Coordinated Universal Time)
協定世界時(UTC)は昔習った記憶があるグリニッジ標準時として知られてました。
timeモジュールを使ってエポック秒からUTC時間に変換する場合は
time.gmtime() 関数を使用します。
import time
filePath = "ファイルパス"
print(time.gmtime(os.path.getctime(filePath)))
実行:
UTC時間がtime.struct_time 時刻値シーケンスの型 で返されました。
「時」がローカル時間の”tm_hour=23″とUTC時間の”tm_hour=14″で違うのが確認できます。
指定した形式の文字列に変換
time.struct_time 時刻値シーケンスの型で返された値を、指定した形式の文字列に変換するには
time.strftime()
の関数を使います。
directive | 意味 |
%a | ロケールの短縮された曜日名 |
%A | ロケールの曜日名 |
%b | ロケールの短縮された月名 |
%B | ロケールの月名 |
%c | ロケールの日時を適切な形式で表します |
%d | 月中の日にちの 10 進表記 |
%H | 時 (24 時間表記) の 10 進表記 |
%I | 時 (12 時間表記) の 10 進表記 |
%j | 年中の日にちの 10 進表記 |
%m | 月の 10 進表記 |
%M | 分の 10 進表記 |
%p | ロケールの”AM”もしくは”PM” |
%S | 秒の 10 進表記 |
%U | 年の初めから何週目かを10進数で表す (日曜が週の始まり) |
%w | 曜日を10進数で表記 |
%W | 年の初めから何週目かを10進数で表す (月曜が週の始まり) |
%x | ロケールの日付を適切な形式で表記 |
%X | ロケールの時間を適切な形式で表記 |
%y | 西暦の下2桁を10進表記で表す[00,99] |
%Y | 西暦(4桁)を10進表記で表す |
%z | タイムゾーンとUTC/GMTとの時差を表す |
%Z | タイムゾーンの名前を表す |
%% | 文字”%”を表す |
time.struct_time 時刻値シーケンスの型から形式を指定して文字列に変換します。
import time
from time import strftime
filePath = "ファイルパス"
print(strftime("%a, %d %b %Y %H:%M:%S", time.localtime(os.path.getctime(filePath))))
実行:
指定した形式で日付と曜日、時刻が出力されました。
日付型・時間型として変換
time.struct_time 時刻値シーケンスの型で返された値を、指定した形式では無く基本的な日付型・時間型として変換する場合は
datetime モジュールを使います。
日付のみの型に変換する場合は
datetime.date() 関数を使います。
from datetime import date
import time
filePath = "ファイルパス"
dtc = date(*time.localtime(os.path.getctime(filePath))[:3])
print(dtc)
実行:
エポック秒からローカル時間に変換され[年・月・日]の日付が出力されました。
日付と時間を合わせた型に変換する場合は
datetime.datetime() 関数を使います。
from datetime import datetime
import time
filePath = "ファイルパス"
dtc_utc= date(*time.gmtime(os.path.getctime(filePath))[:6])
print(dtc_utc)
実行:
エポック秒からUTC時間に変換され[年・月・日・時・分・秒]日付と時間が出力されました。
まとめ:時刻を扱うのはややこしい
Pythonでファイルの作成日・更新日・アクセス日を取得する方法と、取得した値を文字列に変換する方法を紹介しました。
ファイルの比較が目的なら エポック秒 を比べて、大きい方が新しい、小さい方が古いと判断できるので簡単です。
一方、日付や時間に変換する方法は、ローカル時間やUTC時間などで、ややこしくなりがちです。
今回は、time.strftime() 関数を使う方法と、
datetime.date()・datetime.datetime() 関数を使う方法を紹介しましたが、
Pythonには他にも時刻に関連するモジュールや方法があるので、実際に使って違いを確認するのが良いでしょう。
[PR] TechAcademy/テックアカデミー
週2回のビデオチャットや、毎日のチャットサポート、現役プロのメンターから課題のレビューを無制限に受けられる等、マンツーマンのサポートで基礎からしっかり学習できます。
プログラミングやデザインなど沢山のコースがありますが、ユニークなのは「Python + AI」「Unity + iPhoneアプリ」のような複数のコースを受講できるお得な「セット割り」がある事。
機械学習の基礎が学べる「Pythonコース」 |
短期間でPython・機械学習が学べるコースPythonを基礎から学び、機械学習プログラムの開発をめざします。 |
Unityコース |
短期間でゲームアプリを開発出来るようになるコースUnityの操作方法とゲームを動かす為のスクリプト、C#を学べます。 |
|
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
|
|
|
|
|