如何创建文件&修改Python中的日期/时间?

时间:2008-10-25 21:54:57

标签: python file

我有一个脚本,需要根据文件创建和放大器做一些事情。修改日期,但必须在Linux&视窗。

获得文件创建的最佳跨平台方式是什么?修改Python中的日期/时间?

13 个答案:

答案 0 :(得分:637)

你有几个选择。例如,您可以使用os.path.getmtimeos.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通过提供链接到一篇有趣的博客文章,在评论中更清楚地说明了这一点)

答案 1 :(得分:457)

以跨平台的方式获取某种修改日期很简单 - 只需调用os.path.getmtime(path),您就可以获得上次修改path文件时的Unix时间戳。

另一方面,

获取文件创建日期是繁琐且依赖于平台的,甚至在三个大型操作系统之间也是如此:

总而言之,跨平台代码应该看起来像这样......

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

答案 2 :(得分:358)

用于此目的的最佳功能是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)

答案 3 :(得分:46)

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

编辑:在较新的代码中,您应该使用os.path.getmtime()(感谢Christian Oudard)  但请注意,它会返回一个浮点值time_t,其分数为秒(如果您的操作系统支持它)

答案 4 :(得分:37)

有两种方法可以获得mod时间,os.path.getmtime()或os.stat(),但ctime不可靠跨平台(见下文)。

os.path.getmtime()

<强> getmtime 路径
返回上次修改路径的时间。返回值是给出的数字 自纪元以来的秒数(参见时间模块)。如果文件有,则引发os.error 不存在或不可访问。 1.5.2版中的新功能。在版本2.3中更改:如果 os.stat_float_times()返回True,结果是浮点数。

os.stat()

<强> STAT 路径
在给定路径上执行stat()系统调用。返回值是一个对象 属性对应于stat结构的成员,即:st_mode(保护 bits),st_ino(inode number),st_dev(device),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。

答案 5 :(得分:11)

os.stat返回包含st_mtimest_ctime属性的命名元组。两个平台的修改时间均为st_mtime;不幸的是,在Windows上,ctime表示“创建时间”,而在POSIX上则表示“更改时间”。我不知道如何在POSIX平台上获得创建时间。

答案 6 :(得分:4)

在Python 3.4及更高版本中,您可以使用面向对象的pathlib module接口,该接口包括许多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包含的内容的更多信息,请参考the documentation。对于修改时间,您需要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)

This article提供了有关pathlib模块的更多有用信息和示例。

答案 7 :(得分:3)

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

答案 8 :(得分:2)

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

答案 9 :(得分:1)

如果以下符号链接不重要,您还可以使用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

答案 10 :(得分:0)

os.stat确实包含了创建时间。对于包含时间的os.stat()元素,没有st_anything的定义。

所以试试这个:

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

将其与ls -lah

中文件的创建日期进行比较

他们应该是一样的。

答案 11 :(得分: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

答案 12 :(得分:-2)

通过运行系统的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

...其中第四个日期时间是文件创建(而不是ctime更改时间,如其他注释所示)。