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


934

ファイルの作成と変更の日付に基づいて何かを行う必要があるが、LinuxWindowsで実行する必要があるスクリプトがあります

最高何クロスプラットフォームのファイル作成&変更を取得する方法date/timesPythonの


57
クロスプラットフォームの方法でファイル作成時間を取得することはできません。docs.python.org/library/os.path.html#os.path.getctime
Glyph

回答:


621

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

一方、ファイルの作成日を取得するのは面倒でプラットフォームに依存し、3つの大きなOSの間でも異なります。

これをすべてまとめると、クロスプラットフォームコードは次のようになります。

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

9
私はこれを一緒にするために最善を尽くしました(そしてプロセスで数時間を費やしました)、それは以前ここにあった答えよりも少なくとも正しいと確信していますが、これは本当に難しいトピックであり、私はd人々が提供できる修正、説明、またはその他の情報を感謝します。特に、ext4Linuxでドライブ上のこのデータにアクセスする方法を構築したいと思いますst_ctime。また、LinuxがWindowsによって書き込まれたファイルを読み取るとき、またはその逆の場合に、それらが異なる方法で使用されるとどうなるかを知りたいと思います。
Mark Amery 2016

25
率直に言って、ファイルの作成時間は通常、ほとんど役に立ちません。modeを使用して既存のファイルを書き込み用に開く場合、既存のファイル"w"は置き換えられず、既存のファイルが開かれて切り捨てられるだけです。ファイルの内容は作成時の内容とはまったく関係ありませんが、現在のバージョンのかなり前にファイルが「作成された」と通知されます。逆に、保存時にアトミック置換(元のファイルが新しい作業中の一時ファイルに置き換えられる)を使用するエディターでは、1文字を削除しただけでも、より新しい作成日が表示されます。変更時間を使用し、作成時間を気にしないでください。
ShadowRanger 2016年

3
長い年月を経て、ようやくファイル作成時間の用途を見つけました!特定のディレクトリでファイルの命名規則を確認するコードを書いているので、まず、規則が制定された後に最初に命名されたファイルを検討します。全体の内容(最終変更時刻)を交換することは無関係です:それはそれからすでにあった場合、それがで適用除外です。
スティーブ・ジェソップ

1
ハイマーク。簡略化を提案します。Linuxでは、stat.st_ctime多くの場合、最後のメタデータ変更の時刻が作成時刻になる可能性があるため、戻ることはより適切です(少なくともctime実際の作成時刻に近いですmtime)。したがって、スニペットを単にで置き換えることができますstat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime。どう思いますか?乾杯
olibre

4
@olibre "少なくともctimeはmtimeよりも実際の作成時間に近い" -いいえ、そうではありません。これは私が何度か述べたのを見たことがありますが、それは完全に誤りです。iノードの値を手動で変更していない限り、変更変更を引き起こすため(それ自体が「メタデータ」と見なされるため)、ctimeと常に同じかそれ以降mtimeあるmtime必要ありctimeますmtimestackoverflow.com/a/39521489/1709587を参照して、これを説明するためのコード例をいくつか示します。
Mark Amery 2017

676

いくつかの選択肢があります。まず、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()ないない * nixシステム上で作成時刻を参照してくださいではなく、最後の時間は、inodeデータが変更されました。(興味深いブログ投稿へのリンクを提供することでコメントでその事実をより明確にしてくれたkojiroに感謝します)


169
質問に対する@Glyphのコメントを見逃した場合でも、ctimeはPOSIXシステムでの作成時間を意味しません。過去3年間にこの投稿をすくって、バグのあるコードを書いている人はどれくらいいるのだろう。
小次郎

16
最初の例では、日時や数値ではなく文字列が返されることに注意してください。
gak 2013

1
ブログ記事@kojiroあなたは、Unix上のファイルのことをより明確にすることができためにリンクしたctimeときは常に更新されますmtimeし(以降mtime「メタデータ」である)、およびのでctime、常に通常に等しい先行のかmtimectimeしたがって、「作成された」時間として扱うことはまったく意味がありません。-1!
Mark Amery 2016

最初のオプションは、ファイルの作成と最後の変更の両方で同じ結果を返します! Last modified: Fri Jan 31 11:08:13 2020そして Created: Fri Jan 31 11:08:13 2020Linux Ubuntu 16.04!
ファリドAlijani

time.ctime(os.path.getmtime(file))ファイルがシステムによって変更されたかユーザーによって変更されたかに応じて、2種類の文字列を返すことがわかりました。システムによって変更されている場合、文字列には月と日の間に2つのスペースがあります。理由はわかりません
Matteo Antolini

376

これに使用する最適な関数は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)

1
この答えも少し間違っています。getmtimeUnixで利用できる最も近いものです(作成日を取得できない場合)が、Windowsで使用するのに最適な関数ではありませんctime
Mark Amery

3
@MarkAmery-この回答は、修正時間に関するものとして明確にラベル付けされています。
ArtOfWarfare 2017年

47

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

編集:新しいコードではおそらくos.path.getmtime()を使用する必要があります(Christian Oudardに感謝)
が、小数秒のtime_tの浮動小数点値を返すことに注意してください(OSがサポートしている場合)


44
os.path.getmtime()はこのために作成されたもので、より単純です。
クリスチャンオダード2009年

5
ここの「新しいコード」の節は少し誤解を招きやすいものです。os.path.getmtime()は、Python 1.5.2(古いドキュメントを参照)以降に存在し、私がほとんどの赤ちゃんの歯を失う前に、この回答のオリジナルバージョンを作成する前のほぼ10年前にリリースされました。
Mark Amery 2016

39

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

os.path.getmtime()

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

os.stat()

statpath
指定されたパスで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
>>> 

上記の例では、statinfo.st_mtimeまたはstatinfo.st_ctimeを使用して、それぞれmtimeとctimeを取得します。


13

Python 3.4 以降では、多くのosモジュールのラッパーを含むオブジェクト指向のpathlibモジュールインターフェイスを使用できます。ファイルの統計情報を取得する例を次に示します。

>>> 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モジュールのより役立つ情報と例が含まれています。


11

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


ここではより多くのタグ付けされたタプルについてです:stackoverflow.com/questions/2970608/...彼らはタプルのように動作しますが、してみてくださいdir(..)1に。例dir(os.stat(os.listdir('.')[0]))
エフゲニーセルゲーエフ2013年

9
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

-1:他の回答と同じように、これはWindowsでのファイルの作成時間を提供しません(これも、回答に記載されていません)。
ntninja

@ntninja本当によろしいですか?私はWindowsのみを使用しており、これは完全に機能します。私は2015年の初めにこのスクリプトを書きました。ここでは、他のスクリプトよりも明確で、要点がわかりやすく、完全で自明です。(たまたま新しい何かがあった場合に備えて、古いスクリプトの代わりにここを調べることにしました。いや...これがその方法です)
水たまり

ああ、私は言ったつもりです… 「Windows でない限り、これはファイルの作成時間を与えません」ごめんなさい!事実は、この答えは移植可能ではなく、この事実については触れていません。(Linux上の例の出力:pastebin.com/50r5vGBE
ntninja

@ntninjaあなたは他の人にそれから言って行くつもりですか?
水たまり

すでにここに他のコメントを残しています。(最近の)Linuxでも機能する回答をすぐに投稿します。しかし、実際には、あなたの投稿の唯一の誤りは、この事実について言及していないのはWindowsのみの回答であることです。質問OPでは、WindowsおよびLinux互換のソリューションを具体的に求めていました。そのため、この「詳細」を上部のどこかに追加すると、ctimeが複数のプラットフォームをターゲットにしているときに見ているものだと誤解されないようにすると、非常に役立つと思います。
ntninja

2
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 

-1:他の場所で言及されているように、Windowsを使用している場合を除いて、これはファイルの作成時間を提供しません(答えは言及されていません!)
ntninja

0

シンボリックリンクをたどる必要がない場合は、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

これは、(少なくともUnix上)最後の読み取りの時間を与えるだろう間違いを求めたものではありません。
Mark Amery 2016

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

1
私はこれに対して強く助言します:debugfsLinuxは定義上不安定であり、すべてにトップレベルのrootアクセスを必要とし、ほとんどすべての面で母親が常にあなたに警告したことの1つになる傾向があります。(しかし、はい、本当に必死で、セキュアブートのないシステムで実際のスーパーユーザーになっている場合は、おそらく機能します...)
ntninja

@ntninja私はおそらく本番環境でも使用しないでしょうが、「ホームスクリプト」には役立つかもしれません。
Delgan

-2

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

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

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

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

それらは同じでなければなりません。


6
違う!os.stat( 'feedparser.py')[8]は、作成時間ではなくst_mtimeを参照します。ドキュメントを参照してください:docs.python.org/library/os.html#os.stat
millerdev

4
醜い数字の代わりに.st_ctimeを使用してください[8]。
guettli

-3

システムのstatコマンドを実行して出力を解析することで、posixで作成時間を取得できました。

commands.getoutput('stat FILENAME').split('\"')[7]

ターミナル(OS X)からpythonの外でstatを実行すると、次が返されます:

805306374 3382786932 -rwx------ 1 km staff 0 1098083 "Aug 29 12:02:05 2013" "Aug 29 12:02:05 2013" "Aug 29 12:02:20 2013" "Aug 27 12:35:28 2013" 61440 2150 0 testfile.txt

...ここで、4番目の日時はファイルの作成です(他のコメントに記載されているctime変更時間ではありません)。


13
-1:シェルコマンドから人間向けの出力を解析することは非常に悪い考えです。そして、このコマンドは相互互換性さえありません。
MestreLion 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.