Python获取文件大小修改时间:pathlib.stat详解
用Python pathlib.stat()获取文件大小、修改时间、创建时间、权限等元数据,格式化输出可读日期,完整可运行代码。
场景痛点
整理文件时需要知道每个文件多大、最后什么时候改的,按修改时间排序或找出大文件清理。在资源管理器里虽然能看,但没法批量导出成表格。用Python脚本批量读取文件元数据,一次性输出文件名、大小、修改时间,还能按大小或时间排序筛选。
用到的库
pathlib # 标准库
datetime # 标准库,时间格式化
完整代码
from pathlib import Path
from datetime import datetime
def human_size(num_bytes: int) -> str:
"""把字节数转成人类可读的大小"""
for unit in ['B', 'KB', 'MB', 'GB']:
if num_bytes < 1024:
return f"{num_bytes:.2f} {unit}"
num_bytes /= 1024
return f"{num_bytes:.2f} TB"
def get_file_info(file_path: str) -> dict:
"""
获取单个文件的元信息
"""
p = Path(file_path)
stat = p.stat()
return {
"文件名": p.name,
"完整路径": str(p.resolve()),
"大小": human_size(stat.st_size),
"大小字节": stat.st_size,
"修改时间": datetime.fromtimestamp(stat.st_mtime).strftime('%Y-%m-%d %H:%M:%S'),
"创建时间": datetime.fromtimestamp(stat.st_ctime).strftime('%Y-%m-%d %H:%M:%S'),
"访问时间": datetime.fromtimestamp(stat.st_atime).strftime('%Y-%m-%d %H:%M:%S'),
}
def list_files_info(dir_path: str, sort_by: str = 'mtime', desc: bool = True) -> list:
"""
列出目录下所有文件的信息并排序
:param sort_by: 'mtime'按修改时间, 'size'按大小, 'name'按文件名
"""
root = Path(dir_path)
files = []
for file in root.iterdir():
if file.is_file():
files.append(get_file_info(str(file)))
# 排序
key_map = {
'mtime': lambda x: x['修改时间'],
'size': lambda x: x['大小字节'],
'name': lambda x: x['文件名']
}
files.sort(key=key_map.get(sort_by, key_map['name']), reverse=desc)
return files
if __name__ == "__main__":
infos = list_files_info("./reports", sort_by='size', desc=True)
print(f"{'文件名':<30} {'大小':>10} 修改时间")
print("-" * 70)
for info in infos:
print(f"{info['文件名']:<30} {info['大小']:>10} {info['修改时间']}")
代码讲解
Path.stat():返回os.stat_result对象,包含文件所有元数据。常用字段:st_size大小字节、st_mtime修改时间、st_ctime创建时间、st_atime访问时间。human_size:字节数逐级除以1024,自动选B/KB/MB/GB单位,输出人类可读的大小。datetime.fromtimestamp(stat.st_mtime):把浮点时间戳转成本地时区时间,再用strftime格式化成年-月-日 时:分:秒字符串。root.iterdir():列出目录下一级文件和子目录(不递归)。要递归用rglob('*')。- 排序:用lambda字典把排序字段映射到实际key,一行代码切换排序依据。
运行结果
终端按文件大小从大到小打印表格:
文件名 大小 修改时间
----------------------------------------------------------------------
季度报告汇总.xlsx 2.45 MB 2026-09-10 14:23:11
合同扫描件.pdf 1.18 MB 2026-09-08 09:15:33
日报.docx 45.20 KB 2026-09-12 17:40:22
注意事项
st_ctime在Windows上是创建时间,在Linux上是inode变更时间(不是创建时间)。跨平台脚本要注意这个差异。- 符号链接的
stat()默认跟随链接取目标文件信息。要取链接本身的信息用lstat()。 - 文件正在被其他程序写入时,读到的大小和时间可能是中间状态。建议先关闭文件再读取。

更新时间:2026-09-14 21:16:35