web-dev-qa-db-ja.com

Pythonでファイルの作成と変更の日時を取得する方法

私はファイルの作成と修正の日付に基づいていくつかのことをする必要があるが、LinuxとWindows上で実行しなければならないスクリプトを持っています。

Pythonでファイルの作成と修正の日時を取得するための最良のcross-platform方法は何ですか?

795
Mark Biek

クロスプラットフォームの方法である種の変更日付を取得するのは簡単です-単に os.path.getmtime(path) を呼び出すと、pathにあるファイルが最後に変更されたときのUnixタイムスタンプを取得できます。

一方、ファイルcreationの日付の取得は厄介でプラットフォームに依存しており、3つの大きなOS間でも異なります。

  • Windows、ファイルのctimehttps://msdn.Microsoft.com/en-us/libraryに文書化) /14h5k7ff.aspx )は、作成日を保存します。これにアクセスするには、Pythonで os.path.getctime() または .st_ctimeos.stat() の呼び出し結果の属性を使用します。このはUNIXでは機能しません。ここで、ctimeファイルの属性orコンテンツが最後にあった時間です)変更
  • Mac、およびその他のUnixベースのOSでは、呼び出しの結果の .st_birthtime 属性を使用できますos.stat()へ。
  • Linuxでは、少なくともPython用のC拡張を作成しない限り、これは現在不可能です。 Linuxで一般的に使用される一部のファイルシステム 作成日を保存する (たとえば、ext4st_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
490
Mark Amery

いくつかの選択肢があります。たとえば、 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に感謝します)

634
Bryan Oakley

これに使うのに最も良い関数は 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)
358

os.stat https://docs.python.org/2/library/stat.html#module-stat

編集:新しいコードではおそらく os.path.getmtime() を使うべきです - (Christian Oudardに感謝)
しかし、これは小数部秒を含むtime_tの浮動小数点値を返すことに注意してください(OSがサポートしている場合)

46
Martin Beckett

Mod timeを取得するには、os.path.getmtime()またはos.stat()の2つの方法がありますが、ctimeは信頼性の高いクロスプラットフォームではありません(下記参照)。

os.path.getmtime()

getmtime path
最後にパスを修正した時刻を返します。戻り値は、エポックからの経過秒数を示す数値です(timeモジュールを参照)。ファイルが存在しないかアクセスできない場合はos.errorを送出します。バージョン1.5.2の新機能バージョン2.3で変更された仕様:os.stat_float_times()がTrueを返す場合、結果は浮動小数点数になります。

os.stat()

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を使用します。

37
Jay

os.statは、st_mtimeおよびst_ctime属性を持つ名前付きTupleを返します。修正時間は両方のプラットフォームでst_mtimeです。残念ながら、Windowsではctimeは「作成時間」を意味しますが、POSIXでは「変更時間」を意味します。私はPOSIXプラットフォームで作成時間を取得する方法を知りません。

11
mithrandi

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モジュールに関するより有益な情報と例があります。

4
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 
3
unmounted
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
3
Puddle

シンボリックリンクをたどることが重要でなければ、組み込みの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
1
Low Kian Seong

ファイル作成時へのクロスプラットフォームアクセスを実装する 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
0
Delgan

os.statは作成時間を含みます。時間を含むos.stat()の要素に対するst_anythingの定義はありません。

だからこれを試してみてください。

os.stat('feedparser.py')[8]

Ls -lahでファイルの作成日とそれを比較してください。

それらは同じであるべきです。

0
pat Callahan