携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情
前言
文件元数据是与特定文件相关联的所有内容,而不是文件数据内容本身。最常用的文件元数据是文件名,但除此之外还有很多文件元数据可用,例如文件大小、创建日期或文件权限等。
文件元数据用途
这些元数据在进行文件过滤和查找时十分重要,例如,过滤早于 8
月 10
日创建的文件,或查找所有大于 1KB
的文件。在本节中,我们将学习如何使用 Python
访问文件元数据。
Python 读取文件元数据
我们继续使用在《文件读取》一节中使用的 python_zen.txt
文件。通过使用 ls
命令,可以看到该文件大小为 823
字节,并于 8
月 9
日创建:
$ ls -lrt python_zen.txt
-rw-rw-r-- 1 brainiac brainiac 823 Aug 9 21:44 python_zen.txt
复制代码
为了读取文件元数据,首先需要导入 os
和 datetime
模块:
>>> import os
>>> from datetime import datetime
复制代码
检索 python_zen.txt
文件的统计信息:
>>> stats = os.stat(('python_zen.txt'))
>>> stats
os.stat_result(st_mode=33204, st_ino=36963117, st_dev=2053, st_nlink=1, st_uid=1000, st_gid=1000, st_size=823, st_atime=1660052868, st_mtime=1660052669, st_ctime=1660052678)
复制代码
os.stats
返回一个表示存储在文件系统中的元数据的统计对象,其主要包括:
- 文件的大小(以字节为单位),使用
st_size
属性 - 上次修改文件内容的时间,使用
st_mtime
属性 - 上次读取(访问)文件的时间,使用
st_atime
属性
其中时间使用标准时间戳返回,根据时间戳创建并返回一个日期时间对象,以便更好地访问数据。
我们可以使用这些值过滤文件并访问目标文件。例如,我们可以无需使用 open()
打开文件即可读取其元数据,通过读取修改时间来检测文件是否在某一时间后被更改比对比两个文件间的内容差异更快,因此可以利用它比较那个文件是最新的版本。
获取文件的大小(以字节为单位):
>>> stats.st_size
823
复制代码
获取文件最后一次修改的时间:
>>> datetime.fromtimestamp(stats.st_mtime)
datetime.datetime(2022, 8, 9, 21, 44, 29, 44346)
复制代码
获取上次访问文件的时间:
>>> datetime.fromtimestamp(stats.st_atime)
datetime.datetime(2022, 8, 9, 21, 47, 48, 869048)
复制代码
为了快速获取所需统计信息,os.path
中还提供了一些便捷函数,这些函数的格式类似 get<value>
模式:
>>> os.path.getsize('python_zen.txt')
823
>>> os.path.getmtime('python_zen.txt')
1660052669.0443463
>>> os.path.getatime('python_zen.txt')
1660052868.8690484
复制代码
返回的时间以 UNIX
时间戳格式打印,调用这三个函数将比调用 os.stats
并读取相应属性的速度要慢。此外,我们也可以检查返回的统计信息以检测可用的元数据。这两种方式都适用于所有文件系统,但是根据不同系统,其可以显示的元数据种类有所不同。例如,要获取文件的创建日期,在 macOS
中需要使用 st_birthtime
属性,在 Windows
中使用 st_mtime
属性。