我的知识记录

Python 批量提取文件夹内所有文件名清单:导出 Excel/TXT

用 Python 递归提取文件夹里所有文件名,导出成 txt 或 csv 清单,含相对路径、大小、修改时间,方便做目录索引、物料盘点、文件交接。

场景痛点

交接项目、盘点素材库、做物料清单,需要把一个文件夹里所有文件名整理成一张表交给同事。手动复制粘贴太慢,子文件夹套好几层根本理不清。用 Python 递归把所有文件的相对路径、大小、修改时间抓出来,直接导出成 csv 或 txt,用 Excel 打开就能筛选排序。

用到的库

纯标准库,无需 pip 安装(csv 为标准库):

# os、csv、datetime 为标准库

完整代码

import os
import csv
from datetime import datetime

# ========== 配置区 ==========
ROOT_DIR = "./项目素材"          # 要提取清单的根目录
OUTPUT_FILE = "./文件清单.csv"    # 输出文件
EXPORT_RELATIVE_PATH = True      # True=存相对路径,False=存绝对路径
# ============================


def human_size(n: float) -> str:
for unit in ["B", "KB", "MB", "GB", "TB"]:
if n < 1024:
return f"{n:.1f} {unit}"
n /= 1024
return f"{n:.1f} PB"


def main():
if not os.path.isdir(ROOT_DIR):
print(f"目录不存在:{ROOT_DIR}")
return

rows = []
for dirpath, dirnames, filenames in os.walk(ROOT_DIR):
# 同时记录子文件夹,让清单能反映目录结构
for d in dirnames:
full = os.path.join(dirpath, d)
rel = os.path.relpath(full, ROOT_DIR)
rows.append({
"类型": "文件夹",
"路径": rel if EXPORT_RELATIVE_PATH else full,
"大小": "-",
"修改时间": datetime.fromtimestamp(os.path.getmtime(full)).strftime("%Y-%m-%d %H:%M"),
})
for name in filenames:
full = os.path.join(dirpath, name)
rel = os.path.relpath(full, ROOT_DIR)
try:
size = os.path.getsize(full)
mtime = os.path.getmtime(full)
except (PermissionError, OSError):
continue
rows.append({
"类型": "文件",
"路径": rel if EXPORT_RELATIVE_PATH else full,
"大小": human_size(size),
"修改时间": datetime.fromtimestamp(mtime).strftime("%Y-%m-%d %H:%M"),
})

# 按路径排序,输出整齐
rows.sort(key=lambda r: r["路径"])

# 写 csv,指定 utf-8-sig 让 Excel 直接打开不乱码
with open(OUTPUT_FILE, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["类型", "路径", "大小", "修改时间"])
writer.writeheader()
writer.writerows(rows)

print(f"共导出 {len(rows)} 条记录 -> {OUTPUT_FILE}")


if __name__ == "__main__":
main()

代码讲解

  • os.walk 同时收文件夹和文件:dirnames 记录子目录、filenames 记录文件,导出来的清单能完整反映目录结构,不只是平铺文件名。
  • 相对路径 os.path.relpath:导出相对于 ROOT_DIR 的路径,比如 合同/2024/定稿.pdf。这样清单拷给别人也能看懂目录层级,不会带上你机器上的绝对路径。
  • 大小和修改时间:每个文件带上可读的大小和修改时间,Excel 里可以按时间排序、按大小筛选,盘点更方便。
  • utf-8-sig 编码:写 csv 时用 utf-8-sig(带 BOM),Excel 双击打开中文不乱码。用普通 utf-8 在 Excel 里打开会乱码,这是坑。
  • 排序:导出前按路径排一下,输出整齐,像一棵目录树。

运行结果

脚本跑完在 OUTPUT_FILE 位置生成一个 csv 文件,用 Excel 打开,每行是一条「类型/路径/大小/修改时间」记录。直接发给同事,或自己在 Excel 里做筛选、统计、核对。

注意事项

  • utf-8-sig 不是 utf-8:给 Excel 用就用 utf-8-sig;给程序读就用 utf-8。别用错。
  • 相对 vs 绝对路径:交接用相对路径更通用;要做本机自动化处理用绝对路径。
  • 软链接/快捷方式:会被当成普通文件列出来,不需要就在遍历时过滤。
  • 隐藏文件.DS_Store.git 也会进清单。想过滤就在遍历时跳过以 . 开头的名字。
  • 大目录导出慢:几十万文件的目录导出 csv 会比较大,正常现象,打开 Excel 时也会卡,必要时按子目录分批导。

Python 批量提取文件夹内所有文件名清单:导出 Excel/TXT

标签:

更新时间:2026-09-14 21:20:55

上一篇:Python批量提取压缩包密码列表教程

下一篇:Python批量记录文件清单到Excel台账教程