我的知识记录

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()
  • 文件正在被其他程序写入时,读到的大小和时间可能是中间状态。建议先关闭文件再读取。

Python获取文件大小修改时间:pathlib.stat详解

标签:

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

上一篇:Python增量备份脚本:只复制有变化的文件省时间

下一篇:Python批量生成文件夹目录树清单:导出目录结构到文本