文章目录

  • 参考
  • 描述
  • 文件时间戳
      • 时间戳
      • 时间结构体
      • 文件时间戳
  • 获取文件时间戳信息
      • 文件的元数据信息
      • 文件时间戳
  • 修改文件时间戳信息
      • 将指定的时间转换为时间戳
      • 访问时间戳与修改时间戳
      • 创建时间戳与元数据更改时间戳信息
  • 细节
      • 创建时间戳与元数据更改时间戳
      • 元数据更改时间戳
      • 读取或写入操作对元数据更改时间戳的影响

参考

项目描述
搜索引擎Google 、Bing
Python 官方文档time – 时间的访问和转换
Python 官方文档os – 多种操作系统接口

描述

项目描述
Python 解释器3.10.6
WIndows 操作系统Windows 10 专业版(x86-64)
Linux 操作系统Kali-Linux(x86-64)

文件时间戳

时间戳

时间戳(Timestamp)是一种表示日期和时间的方式,通常使用一个数字来表示。它表示自从某个固定日期(1970年1月1日00:00:00 UTC)到当前日期和时间所经过的 秒数时间戳可以是正数或负数,正数表示自1970年1月1日00:00:00 UTC到现在的时间,负数表示1970年1月1日之前的时间。 时间戳在计算机中被广泛使用,特别是在操作系统、数据库、日志记录和其他与时间相关的应用中。

在 Python 中,可以使用 time 模块来处理时间戳。该模块提供了许多函数来获取当前时间戳、将时间戳转换为可读的日期和时间格式、将日期和时间格式转换为时间戳等功能。例如,可以使用 time.time() 函数来获取当前时间戳,或者使用 time.strftime() 函数将时间戳转换为可读的日期和时间格式。对此,请参考如下示例:

import time# 获取当前时间所对应的时间戳now = time.time()print(now)# 由于 time.strftime() 函数仅支持结构体时间 (stract_time)# 在此我们将时间戳进行转换为对应的结构体时间。strict_now = time.localtime(now)print(strict_now)# 将时间戳转换为易读的文本格式pretty_now = time.strftime('%Y-%m-%d %H:%M:%S', strict_now)print(pretty_now)

执行效果

1682121313.8553572time.struct_time(tm_year=2023, tm_mon=4, tm_mday=22, tm_hour=7, tm_min=55, tm_sec=13, tm_wday=5, tm_yday=112, tm_isdst=0)2023-04-22 07:55:13

时间结构体

Python time 模块中的结构体时间(struct_time)是用于表示时间和日期的数据结构,其本质为具名元组。

时间结构体也是一个包含时间和日期信息的数据结构,但是 该数据结构(本质为命名元组)中的每一个元素都含有属于自己的名称,你可以通过句点运算符访问结构体元组中的目标元素(同访问对象中的属性类似,访问目标元素所需要使用到的属性名为该元素在具名元组中的名称)。结构体元组的格式如下:

time.struct_time(tm_year=xxxx, tm_mon=xx, tm_mday=xx, tm_hour=xx, tm_min=xx, tm_sec=xx, tm_wday=xx, tm_yday=xx, tm_isdst=xx)

文件时间戳

在计算机中,文件时间戳(File Timestamp)是指用于记录文件在不同时间点的状态和属性的信息。常见的文件时间戳包括以下四种:

项目描述
创建时间戳(Creation Timestamp)指文件创建的时间和日期。
修改时间戳(Modification Timestamp)指文件内容最后一次被修改的时间和日期。
访问时间戳(Access Timestamp)指文件最后一次被访问的时间和日期。
元数据更改时间戳 (Metadata Change Time)指的是文件的元数据信息(例如文件名称、权限、所有者、所属组、大小、时间戳等)最近一次被修改的时间。

注:

在 Windows 系统下,文件时间戳一般由除元数据更改时间戳的另外三种时间戳组成;而 类 Unix(如 Linux)系统的文件时间戳一般由除创建时间戳外的另外三种时间戳组成。

获取文件时间戳信息

文件的元数据信息

os.stat() 函数是 Python 标准库中 os 模块提供的一个函数,能够用于获取指定文件的元数据信息(包括文件时间戳信息)。对此,请参考如下示例:

import osimport time# 获取当前工作目录下的 target 文件夹的元数据meta_info = os.stat('target')# 获取文件时间戳信息并将其转换为时间结构体ctime = time.localtime(meta_info.st_ctime)mtime = time.localtime(meta_info.st_mtime)atime = time.localtime(meta_info.st_atime)# 使用 time.strftime() 输出更易读的时间print('【创建时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', ctime))print('【修改时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', mtime))print('【访问时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', atime))

执行效果

【创建时间戳】 2023-04-22 08:28:52【修改时间戳】 2023-04-22 08:28:52【访问时间戳】 2023-04-22 08:51:52

文件时间戳

除了通过文件元数据信息获取时间戳信息外,我们还可以通过 os.path 模块中提供的函数直接获取目标类型的文件时间戳。对此,请参考如下示例:

import osimport time# 目标文件所处的相对路径FILE_PATH = 'target'# 通过 os.path.getctime() 获取创建时间戳ctime = time.localtime(os.path.getctime(FILE_PATH))# 通过 os.path.getmtime() 获取修改时间戳mtime = time.localtime(os.path.getmtime(FILE_PATH))# 通过 os.path.getatime() 获取访问时间戳atime = time.localtime(os.path.getatime(FILE_PATH))print('【创建时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', ctime))print('【修改时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', mtime))print('【访问时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', atime))

执行效果

【创建时间戳】 2023-04-22 08:28:52【修改时间戳】 2023-04-22 08:28:52【访问时间戳】 2023-04-22 08:51:52

修改文件时间戳信息

将指定的时间转换为时间戳

时间到时间结构体

time 模块提供了 strptime() 函数,用于将目标时间(字符串形式)转换为时间结构体。对此,请参考如下示例:

import time# strptime() 函数接收的第一个参数为需要转换为时间元组# 的目标时间,第二个参数为该时间所对应的格式字符串。time_tuple = time.strptime('2022-4-16 8:45:36', '%Y-%m-%d %H:%M:%S')print(time_tuple)

执行效果

time.struct_time(tm_year=2022, tm_mon=4, tm_mday=16, tm_hour=8, tm_min=45, tm_sec=36, tm_wday=5, tm_yday=106, tm_isdst=-1)

时间结构体到时间戳

time 模块提供了 mktime() 函数,用于将时间结构体转换为对应的时间戳。对此,请参考如下示例:

import timetime_tuple = time.strptime('2022-4-16 8:45:36', '%Y-%m-%d %H:%M:%S')print(time_tuple)# 使用 mktime 函数将时间元组转换为时间戳timestamp = time.mktime(time_tuple)print(timestamp)

执行效果

time.struct_time(tm_year=2022, tm_mon=4, tm_mday=16, tm_hour=8, tm_min=45, tm_sec=36, tm_wday=5, tm_yday=106, tm_isdst=-1)1650069936.0

访问时间戳与修改时间戳

os 模块提供了 utime() 函数,使用该函数我们将能够修改文件的访问时间戳及修改时间戳信息。

os.utime(path, times=None)

其中:

项目描述
path需要修改文件时间戳信息的文件的路径。
times一个包含访问时间戳和修改时间戳的元组。如果 times 被省略,那么默认使用当前时间作为文件的访问时间戳与修改时间戳。

举个栗子

import osimport time# 获取当前的文件时间戳信息def get_timestamp():mtime = time.localtime(os.path.getmtime(FILE_PATH))atime = time.localtime(os.path.getatime(FILE_PATH))print('【修改时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', mtime))print('【访问时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', atime))if __name__ == '__main__':# 需要修改时间戳信息的文件所在的相对路径FILE_PATH = 'target'# 获取目标文件当前的文件时间戳信息get_timestamp()# 设置修改时间戳后的结果值replace_tuple = time.strptime('1999-3-13 4:03:23', '%Y-%m-%d %H:%M:%S')modify_tuple = time.strptime('1989-5-20 14:45:19', '%Y-%m-%d %H:%M:%S')replace_timestamp = time.mktime(replace_tuple)modify_tuple = time.mktime(modify_tuple)# 修改文件的修改时间戳以及访问时间戳os.utime(FILE_PATH, (replace_timestamp, modify_tuple))# 再次获取目标文件的文件时间戳信息get_timestamp()

执行效果

【修改时间戳】 2023-04-22 08:28:52【访问时间戳】 2023-04-22 08:51:52【修改时间戳】 1989-05-20 14:45:19【访问时间戳】 1999-03-13 04:03:23

创建时间戳与元数据更改时间戳信息

在 Python 中,无法直接(在 Windows 系统中,可以使用 PyWin32 模块利用操作系统提供的 API 间接修改创建时间戳信息)修改文件的创建时间戳或元数据更改时间戳。这是因为这些时间戳是由操作系统维护的,而不是由 Python 程序控制的。

细节

创建时间戳与元数据更改时间戳

在前面的例子中,我们并没有尝试获取文件的元数据更改时间戳,这是因为前面的例子均是在 Windows 操作系统中运行的。在 Linux 操作系统中,你可以使用前面讲到的各种用于获取创建时间戳信息的来获取元数据更改时间戳。

元数据更改时间戳

访问时间戳或修改时间戳的变化将导致元数据更改时间戳的变化(文件的时间戳信息属于文件的元数据信息),这意味着我们可以通过修改文件的时间戳信息来影响文件的元数据更改时间戳。

举个栗子

import osimport timectime = os.path.getctime('target')print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(ctime)))os.utime('zzh', (time.time(), time.time()))ctime = os.path.getctime('target')print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(ctime)))

Windows 系统

在 Windows 操作系统下,执行上述程序后变量 ctime 的值并没有发生更改,这是因为 os.path.getctime() 函数在 Windows 操作系统下获取到的时间戳信息为创建时间戳。

2023-04-21 21:38:192023-04-21 21:38:19

Linux 系统

在 Linux 系统下,由于修改了文件的元数据信息(修改时间戳及访问时间戳),导致了文件的元数据时间戳发生了变化。

2023-04-21 21:38:182023-04-21 22:25:44

读取或写入操作对元数据更改时间戳的影响

对文件进行自然的访问或修改将导致文件的元数据更改时间戳发生变化,通过程序对文件进行读取或写入操作时也将导致文件的元数据更改时间戳发生变化。 对此,请参考如下示例:

import osimport time# 输出文件时间戳信息def get_timestamp():ctime = time.localtime(os.path.getctime('target.txt'))atime = time.localtime(os.path.getatime('target.txt'))print('【元数据更改时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', ctime))print('【访问时间戳】', time.strftime('%Y-%m-%d %H:%M:%S', atime))if __name__ == '__main__':# 尝试输出文件的时间戳信息get_timestamp()# 尝试读取 target.txt 文件with open('target.txt', 'w+') as fo:fo.read()# 在次尝试输出文件的时间戳信息get_timestamp()

执行效果

【元数据更改时间戳】 2023-04-22 10:41:08【访问时间戳】 2023-04-22 10:41:08【元数据更改时间戳】 2023-04-22 10:50:09【访问时间戳】 2023-04-22 10:50:09