How to get file creation & modification date/times in Python?
Getting some sort of modification date in a cross-platform way is easy - just call
os.path.getmtime(path) and you'll get the Unix timestamp of when the file at
path was last modified.
Getting file creation dates, on the other hand, is fiddly and platform-dependent, differing even between the three big OSes:
- On Windows, a file's
ctime(documented at https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx) stores its creation date. You can access this in Python through
.st_ctimeattribute of the result of a call to
os.stat(). This won't work on Unix, where the
ctimeis the last time that the file's attributes or content were changed.
- On Mac, as well as some other Unix-based OSes, you can use the
.st_birthtimeattribute of the result of a call to
On Linux, this is currently impossible, at least without writing a C extension for Python. Although some file systems commonly used with Linux do store creation dates (for example,
ext4stores them in
st_crtime) , the Linux kernel offers no way of accessing them; in particular, the structs it returns from
stat()calls in C, as of the latest kernel version, don't contain any creation date fields. You can also see that the identifier
st_crtimedoesn't currently feature anywhere in the Python source. At least if you're on
ext4, the data is attached to the inodes in the file system, but there's no convenient way of accessing it.
The next-best thing on Linux is to access the file's
mtime, through either
.st_mtimeattribute of an
os.stat()result. This will give you the last time the file's content was modified, which may be adequate for some use cases.
Putting this all together, cross-platform code should look something like this...
import osimport platformdef 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
import os.path, timeprint("last modified: %s" % time.ctime(os.path.getmtime(file)))print("created: %s" % time.ctime(os.path.getctime(file)))
Your other option is to use
import os, time(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file)print("last modified: %s" % time.ctime(mtime))
ctime() does not refer to creation time on *nix systems, but rather the last time the inode data changed. (thanks to kojiro for making that fact more clear in the comments by providing a link to an interesting blog post)
The best function to use for this is os.path.getmtime(). Internally, this just uses
The datetime module is the best manipulating timestamps, so you can get the modification date as a
datetime object like this:
import osimport datetimedef modification_date(filename): t = os.path.getmtime(filename) return datetime.datetime.fromtimestamp(t)
'/var/log/syslog')print d2009-10-06 10:50:01print repr(d)datetime.datetime(2009, 10, 6, 10, 50, 1)d = modification_date(