复制文件时,在Python中使用os.stat的修改时间会降低

Bra*_*ers 0 python file copying stat

我遇到的问题是在路径上使用os.stat的一部分(例如,以C:\ myfile1.txt为例).当我在这个文件上运行os.stat并在结果列表中取第9个元素时,我得到了一些数字形式的修改时间(例如1348167977).

注意:我不确定如何计算这些数字.

当我创建C:\ myfile1.txt时,它有一些数字,如上例所示.如果我创建另一个文件C:\ myfile2.txt,它会得到一个代表修改时间的新数字,该数字高于C:\ myfile1.txt(这就像我期望的那样).我还有一个最后创建的第三个文件C:\ myfile3.txt.

如果我复制C:\ myfile2.txt并用生成的复制文件覆盖C:\ myfile3.txt,则会出现问题,新的C:\ myfile3.txt上的os.stat显示的修改时间小于C:\ myfile1.txt.为什么会这样?C:\ myfile3.txt的修改时间应该是最高或者至少等于C:\ myfile2.txt.

谢谢你的回答,我希望我能够解释得很清楚.

编辑:

这里有一些示例代码来测试我描述的内容.有时,如果你在不同的时间重新运行数字,它们的工作原理会有所不同.我想我只是不完全理解我输出的MTIME.

import os
import shutil
import time

myfile1 = open("C:\\myfile1.txt", 'wt')
myfile1.close()
time.sleep(10)
myfile2 = open("C:\\myfile2.txt", 'wt')
myfile2.close()
time.sleep(10)
myfile2 = open("C:\\myfile3.txt", 'wt')
myfile2.close()

shutil.copyfile("C:\\myfile2.txt", "C:\\myfile3.txt")

modified_time_first = (os.stat("C:\\myfile1.txt")[9])
modified_time_second = (os.stat("C:\\myfile2.txt")[9])
modified_time_third = (os.stat("C:\\myfile3.txt")[9])

print "The first files modified time is: "
print modified_time_first
print ""

print "The second files modified time is: " 
print modified_time_second
print ""

print "The third files modified time is: " 
print modified_time_third
print ""
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

您看到的数字是UNIX时间戳,表示自1970年1月1日以来的秒数.您可以使用datetime.datetime.fromtimestamp()它将其转换为python datetime对象,例如:

>>> import datetime
>>> datetime.datetime.fromtimestamp(1348167977)
datetime.datetime(2012, 9, 20, 21, 6, 17)
Run Code Online (Sandbox Code Playgroud)

注意,os.stat()返回一个命名元组; 您也可以按名称访问该元组的属性:

>>> import os
>>> os.stat('test.txt').st_mtime
1348169795.0
Run Code Online (Sandbox Code Playgroud)

有关可用的所有属性,请参阅os.stat()文档.

另一方面,您访问了该st_ctime值; python元组和列表索引从0开始,因此第9个元素是索引8.您访问索引10,即文件的创建时间.

如果您只需要修改文件的时间,您还可以os.path.getmtime()使用方便的快捷方式:

>>> os.path.getmtime('test.txt')
1348169795.0
>>> datetime.datetime.fromtimestamp(os.path.getmtime('test.txt'))
datetime.datetime(2012, 9, 20, 21, 36, 35)
Run Code Online (Sandbox Code Playgroud)

复制文件时,通常会包含最后修改时间戳等属性,因此新复制文件的修改时间可以轻松地向后和向前更改.这同样适用于创建时间.