Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得文件创建&;Python中的修改日期/时间?_Python_File - Fatal编程技术网

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

如何获得文件创建&;Python中的修改日期/时间?,python,file,Python,File,我有一个脚本,需要根据文件创建和修改日期执行一些操作,但必须在Linux和Windows上运行 在Python中获得文件创建和修改date/times的最佳跨平台方法是什么?os.stat 编辑:在较新的代码中,您可能应该使用(感谢Christian Oudard) 但是请注意,它返回一个时间的浮点值,带有小数秒(如果您的操作系统支持的话)您有两个选择。首先,您可以使用和功能: import os.path, time print("last modified: %s" % time.ctime

我有一个脚本,需要根据文件创建和修改日期执行一些操作,但必须在LinuxWindows上运行

Python中获得文件创建和修改
date/times
的最佳跨平台方法是什么?

os.stat

编辑:在较新的代码中,您可能应该使用(感谢Christian Oudard)

但是请注意,它返回一个时间的浮点值,带有小数秒(如果您的操作系统支持的话)

您有两个选择。首先,您可以使用和功能:

import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))
您的另一个选择是使用:


注意
ctime()
不是指*nix系统上的创建时间,而是指上次更改inode数据的时间。(感谢kojiro通过提供一个有趣博客帖子的链接在评论中更清楚地说明了这一事实)

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

getmtime(路径)
返回上次修改路径的时间。返回值是一个给出 自历元起的秒数(请参阅时间模块)。如果文件不存在,则引发os.error 不存在或无法访问。版本1.5.2中的新功能。在版本2.3中更改:如果 stat\u float\u times()返回True,结果是一个浮点数

stat(路径)
在给定路径上执行stat()系统调用。返回值是一个对象,其 属性对应于stat结构的成员,即:st_mode(protection 位)、st_ino(inode编号)、st_dev(设备)、st_nlink(硬链接数)、st_uid (所有者的用户ID)、st_gid(所有者的组ID)、st_大小(文件大小,以字节为单位), st_atime(最近访问的时间),st_mtime(最近内容的时间 修改),st\u-ctime(取决于平台;Unix上最新元数据更改的时间,或Windows上的创建时间):


在上面的示例中,您将使用statinfo.st_mtime或statinfo.st_ctime分别获取mtime和ctime。

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

os.stat
包含创建时间。对于包含时间的
os.stat()

>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 
所以试试这个:

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

将其与ls-lah中文件的创建日期进行比较


它们应该是相同的。

用于此功能的最佳功能是。在内部,它只使用
os.stat(filename).st\u 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)

通过运行系统的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更改时间)。

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

以跨平台的方式获取某种修改日期是很容易的-只需调用,您就会得到
path
上一次修改文件的Unix时间戳

另一方面,获取文件创建日期非常复杂,而且依赖于平台,甚至在三大操作系统之间也存在差异:

  • Windows上,文件的
    ctime
    (记录于)存储其创建日期。在Python中,您可以通过或调用的结果的属性来访问它。这在Unix上不起作用,在Unix上,
    ctime
  • Mac以及其他一些基于Unix的操作系统上,您可以使用调用
    os.stat()
    的结果属性
  • Linux上,这目前是不可能的,至少在不为Python编写C扩展的情况下是不可能的。虽然Linux中常用的一些文件系统(例如,
    ext4
    将它们存储在
    st\u crtime
    )中,但Linux内核;特别是,从最新内核版本开始,它从C中调用的
    stat()
    返回的结构。您还可以看到,标识符
    st_crtime
    当前在中的任何位置都不起作用。至少如果您使用的是
    ext4
    ,数据会附加到文件系统中的inode,但是没有方便的方式访问它

    Linux上的下一个最好方法是通过
    os.stat()
    结果的属性或访问文件的
    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

在Python3.4及更高版本中,您可以使用面向对象接口,该接口包括许多操作系统模块的包装器。下面是一个获取文件统计信息的示例

>>> 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)
有关操作系统统计结果所包含内容的更多信息,请参阅。对于所需的修改时间
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)
>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)
如果希望在Windows上创建时间,或在Unix上更改最新的元数据,可以使用
fname.stat().st\u ctime

>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)
>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)
有更多关于pathlib模块的有用信息和示例

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

也许值得一看实现文件创建时跨平台访问的库

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
getmtime()是为此而创建的,并且