私はファイルの作成と修正の日付に基づいていくつかのことをする必要があるが、LinuxとWindows上で実行しなければならないスクリプトを持っています。
Pythonでファイルの作成と修正の日時を取得するための最良のcross-platform方法は何ですか?
クロスプラットフォームの方法である種の変更日付を取得するのは簡単です-単に os.path.getmtime(path)
を呼び出すと、path
にあるファイルが最後に変更されたときのUnixタイムスタンプを取得できます。
一方、ファイルcreationの日付の取得は厄介でプラットフォームに依存しており、3つの大きなOS間でも異なります。
ctime
( https://msdn.Microsoft.com/en-us/libraryに文書化) /14h5k7ff.aspx )は、作成日を保存します。これにアクセスするには、Pythonで os.path.getctime()
または .st_ctime
os.stat()
の呼び出し結果の属性を使用します。このはUNIXでは機能しません。ここで、ctime
ファイルの属性orコンテンツが最後にあった時間です)変更 。.st_birthtime
属性を使用できますos.stat()
へ。Linuxでは、少なくともPython用のC拡張を作成しない限り、これは現在不可能です。 Linuxで一般的に使用される一部のファイルシステム 作成日を保存する (たとえば、ext4
はst_crtime
に保存します)ですが、Linuxカーネル アクセスする方法はありません ;特に、Cのstat()
呼び出しから返される構造体は、最新のカーネルバージョン 作成日フィールドを含まない の時点で。また、識別子st_crtime
は現在、 Pythonソース のどこにも機能していないことがわかります。少なくともext4
を使用している場合、データはファイルシステム内のiノードにアタッチされますが、それにアクセスする便利な方法はありません。
Linuxで次善の策は、 os.path.getmtime()
またはos.stat()
結果の .st_mtime
属性のいずれかを使用して、ファイルのmtime
にアクセスすることです。これにより、ファイルのコンテンツが最後に変更された時間がわかります。これは、いくつかのユースケースに適している場合があります。
これをすべてまとめると、クロスプラットフォームコードは次のようになります...
import os
import platform
def creation_date(path_to_file):
"""
Try to get the date that a file was created, falling back to when it was
last modified if that isn't possible.
See http://stackoverflow.com/a/39501288/1709587 for explanation.
"""
if platform.system() == 'Windows':
return os.path.getctime(path_to_file)
else:
stat = os.stat(path_to_file)
try:
return stat.st_birthtime
except AttributeError:
# We're probably on Linux. No easy way to get creation dates here,
# so we'll settle for when its content was last modified.
return stat.st_mtime
いくつかの選択肢があります。たとえば、 os.path.getmtime
および os.path.getctime
関数を使用できます。
import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))
あなたの他の選択肢は os.stat
を使うことです:
import os, time
(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file)
print("last modified: %s" % time.ctime(mtime))
注 :ctime()
はnotは* nixシステムでの作成時刻を表しますが、むしろiノードデータが最後に変更された時刻を表します。 (興味深いブログ投稿へのリンクを提供することで、コメントでその事実をより明確にしてくれたkojiroに感謝します)
これに使うのに最も良い関数は os.path.getmtime() です。内部的には、これはos.stat(filename).st_mtime
を使うだけです。
Datetimeモジュールはタイムスタンプを操作するのに最適なので、修正日を次のようなdatetime
オブジェクトとして取得できます。
import os
import datetime
def modification_date(filename):
t = os.path.getmtime(filename)
return datetime.datetime.fromtimestamp(t)
使用例
>>> d = modification_date('/var/log/syslog')
>>> print d
2009-10-06 10:50:01
>>> print repr(d)
datetime.datetime(2009, 10, 6, 10, 50, 1)
os.stat https://docs.python.org/2/library/stat.html#module-stat
編集:新しいコードではおそらく os.path.getmtime() を使うべきです - (Christian Oudardに感謝)
しかし、これは小数部秒を含むtime_tの浮動小数点値を返すことに注意してください(OSがサポートしている場合)
Mod timeを取得するには、os.path.getmtime()またはos.stat()の2つの方法がありますが、ctimeは信頼性の高いクロスプラットフォームではありません(下記参照)。
getmtime (path)
最後にパスを修正した時刻を返します。戻り値は、エポックからの経過秒数を示す数値です(timeモジュールを参照)。ファイルが存在しないかアクセスできない場合はos.errorを送出します。バージョン1.5.2の新機能バージョン2.3で変更された仕様:os.stat_float_times()がTrueを返す場合、結果は浮動小数点数になります。
stat (path)
与えられたパスでstat()システムコールを実行します。戻り値は、stat構造体のメンバーに対応する属性を持つオブジェクトです。つまり、st_mode(保護ビット)、st_ino(iノード番号)、st_dev(デバイス)、st_nlink(ハードリンク数)、st_uid(所有者のユーザーID)です。 )、st_gid(所有者のグループID)、st_size(ファイルのサイズ、バイト数)、st_atime(最新のアクセス時刻)、 st_mtime (最新のコンテンツ変更時刻)、 st_ctime (プラットフォームに依存します。Unix上で最新のメタデータが変更された時間、またはWindows上で作成された時間):
>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>>
上記の例では、それぞれmtimeとctimeを取得するのにstatinfo.st_mtimeまたはstatinfo.st_ctimeを使用します。
os.stat
は、st_mtime
およびst_ctime
属性を持つ名前付きTupleを返します。修正時間は両方のプラットフォームでst_mtime
です。残念ながら、Windowsではctime
は「作成時間」を意味しますが、POSIXでは「変更時間」を意味します。私はPOSIXプラットフォームで作成時間を取得する方法を知りません。
Python 3.4以降では、オブジェクト指向の pathlibモジュール osモジュールの大部分のラッパーを含む - /インターフェースを使用できます。これはファイルの統計情報を取得する例です。
>>> import pathlib
>>> fname = pathlib.Path('test.py')
>>> assert fname.exists(), f'No such file: {fname}' # check that the file exists
>>> print(fname.stat())
os.stat_result(st_mode=33206, st_ino=5066549581564298, st_dev=573948050, st_nlink=1, st_uid=0, st_gid=0, st_size=413, st_atime=1523480272, st_mtime=1539787740, st_ctime=1523480272)
os.stat_result
に含まれるものについての詳細は、 ドキュメント を参照してください。修正時間はfname.stat().st_mtime
が欲しいです。
>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)
Windowsでの作成時間、またはUnixでの最新のメタデータの変更が必要な場合は、fname.stat().st_ctime
を使用します。
>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)
この記事 には、pathlibモジュールに関するより有益な情報と例があります。
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>>
import os, time, datetime
file = "somefile.txt"
print(file)
print("Modified")
print(os.stat(file)[-2])
print(os.stat(file).st_mtime)
print(os.path.getmtime(file))
print()
print("Created")
print(os.stat(file)[-1])
print(os.stat(file).st_ctime)
print(os.path.getctime(file))
print()
modified = os.path.getmtime(file)
print("Date modified: "+time.ctime(modified))
print("Date modified:",datetime.datetime.fromtimestamp(modified))
year,month,day,hour,minute,second=time.localtime(modified)[:-3]
print("Date modified: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))
print()
created = os.path.getctime(file)
print("Date created: "+time.ctime(created))
print("Date created:",datetime.datetime.fromtimestamp(created))
year,month,day,hour,minute,second=time.localtime(created)[:-3]
print("Date created: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))
版画
somefile.txt
Modified
1429613446
1429613446.0
1429613446.0
Created
1517491049
1517491049.28306
1517491049.28306
Date modified: Tue Apr 21 11:50:46 2015
Date modified: 2015-04-21 11:50:46
Date modified: 21/04/2015 11:50:46
Date created: Thu Feb 1 13:17:29 2018
Date created: 2018-02-01 13:17:29.283060
Date created: 01/02/2018 13:17:29
シンボリックリンクをたどることが重要でなければ、組み込みのos.lstat
を使うこともできます。
>>> os.lstat("2048.py")
posix.stat_result(st_mode=33188, st_ino=4172202, st_dev=16777218L, st_nlink=1, st_uid=501, st_gid=20, st_size=2078, st_atime=1423378041, st_mtime=1423377552, st_ctime=1423377553)
>>> os.lstat("2048.py").st_atime
1423378041.0
ファイル作成時へのクロスプラットフォームアクセスを実装する crtime
ライブラリを見てみる価値があるかもしれません。
from crtime import get_crtimes_in_dir
for fname, date in get_crtimes_in_dir(".", raise_on_error=True, as_Epoch=False):
print(fname, date)
# file_a.py Mon Mar 18 20:51:18 CET 2019
os.stat
は作成時間を含みます。時間を含むos.stat()
の要素に対するst_anythingの定義はありません。
だからこれを試してみてください。
os.stat('feedparser.py')[8]
Ls -lahでファイルの作成日とそれを比較してください。
それらは同じであるべきです。