对文件内的文件名生成目录,方便查阅
import os
import re
# 定义要查找的目录路径
path = r"J:\...\顺序目录" # 要遍历的主目录路径
# 定义输出的目录文件路径
output_file = r"J:\...\目录_中文文件.txt" # 保存结果的文件路径
# 判断文件名是否包含中文字符
def contains_chinese(text):
return bool(re.search(r'[\u4e00-\u9fff]', text)) # 检查文件名中是否包含中文字符,返回布尔值
# 遍历路径并生成文件目录
def generate_file_directory(path, output_file):
try:
# 打开输出文件
with open(output_file, "w", encoding="utf-8") as f: # 以写入模式打开文件,编码为 UTF-8
f.write("文件目录列表(只包含中文文件名):\n\n") # 写入文件开头标题
f.flush() # 立即将缓冲区内容写入文件
print("文件目录列表(只包含中文文件名):\n") # 在控制台打印标题,用于调试
# 遍历主目录中的 Day 文件夹
for day_dir in sorted(os.listdir(path)): # 列出主目录中的所有文件和文件夹,并按名称排序
day_path = os.path.join(path, day_dir) # 拼接得到 Day 文件夹的完整路径
if os.path.isdir(day_path) and day_dir.startswith("Day"): # 判断当前是否是 Day 文件夹
# 写入 Day 标题
title = f"{day_dir}:\n" # 格式化 Day 文件夹标题
f.write(title) # 写入标题到文件
f.flush() # 刷新缓冲区
os.fsync(f.fileno()) # 强制将数据写入磁盘
print(title, end="") # 在控制台打印标题
# 遍历 Day 文件夹内容
for root, dirs, files in os.walk(day_path): # 遍历当前 Day 文件夹下的所有子目录和文件
# 获取当前目录的相对路径
relative_root = os.path.relpath(root, day_path) # 将当前目录转换为相对于 Day 文件夹的路径
# 筛选包含中文文件的文件名
chinese_files = [file for file in files if contains_chinese(file)] # 筛选出文件名中包含中文的文件
# 如果当前目录有符合要求的文件,则写入目录标题
if chinese_files:
# 判断是否需要使用特殊格式 "-笔记:"、"-视频:" 等
if "笔记" in relative_root: # 如果当前目录路径中包含 "笔记"
section_title = "-笔记:\n"
elif "代码" in relative_root: # 如果当前目录路径中包含 "代码"
section_title = "-代码:\n"
elif "课后作业" in relative_root: # 如果当前目录路径中包含 "课后作业"
section_title = "-课后作业:\n"
elif "课件" in relative_root: # 如果当前目录路径中包含 "课件"
section_title = "-课件:\n"
elif "软件" in relative_root: # 如果当前目录路径中包含 "软件"
section_title = "-软件:\n"
elif "视频" in relative_root: # 如果当前目录路径中包含 "视频"
section_title = "-视频:\n"
else:
section_title = f"{relative_root}:\n" # 如果不属于上述分类,则直接写入相对路径作为标题
# 写入子目录标题
f.write(section_title) # 将子目录标题写入文件
f.flush() # 刷新缓冲区
os.fsync(f.fileno()) # 强制将数据写入磁盘
print(section_title, end="") # 在控制台打印子目录标题
# 写入文件名,使用缩进格式
for file in chinese_files: # 遍历所有符合条件的文件
content = f" ——{file}\n" # 格式化为缩进显示的文件名
f.write(content) # 将文件名写入文件
f.flush() # 实时写入到文件
os.fsync(f.fileno()) # 强制刷新到磁盘
print(content, end="") # 在控制台打印文件名
# 添加空行分隔不同子目录
f.write("\n") # 写入空行
f.flush() # 刷新缓冲区
os.fsync(f.fileno()) # 强制将空行写入文件
print("\n", end="") # 在控制台打印空行
print(f"\n目录已生成到文件: {output_file}") # 程序结束后打印成功提示
except Exception as e:
print(f"发生错误: {e}") # 捕获异常并打印错误信息
# 调用函数生成目录
generate_file_directory(path, output_file) # 执行函数
详细注释说明
-
中文筛选逻辑:
- 函数
contains_chinese
使用正则表达式判断文件名中是否包含中文字符,匹配[\u4e00-\u9fff]
范围的字符。
- 函数
-
os.walk()
的作用:- 遍历指定目录及其子目录,返回当前目录路径(
root
)、子目录列表(dirs
)和文件列表(files
)。
- 遍历指定目录及其子目录,返回当前目录路径(
-
子目录分类:
- 通过判断目录路径中是否包含指定关键词(如
"笔记"
、"代码"
),为不同子目录生成对应的标题格式(如"-笔记:"
)。
- 通过判断目录路径中是否包含指定关键词(如
-
实时写入与控制台打印:
- 每次写入文件后,立即刷新缓冲区并强制写入磁盘:
f.flush() os.fsync(f.fileno())
- 同时将写入内容打印到控制台,便于调试和实时查看进度。
- 每次写入文件后,立即刷新缓冲区并强制写入磁盘:
-
Day 文件夹循环:
- 主目录中的子目录按名称排序,并筛选出以
"Day"
开头的文件夹进行处理。
- 主目录中的子目录按名称排序,并筛选出以
代码执行流程
- 打开目标文件并写入标题。
- 遍历主目录中的
Day
文件夹,对每个Day
文件夹写入标题。 - 遍历
Day
文件夹中的子目录和文件:- 根据目录名称分类(如
"-笔记:"
)。 - 筛选出包含中文的文件,并以缩进格式写入。
- 根据目录名称分类(如
- 每次写入后立即刷新文件内容,确保实时更新。
- 程序执行完毕后,生成文件包含所有符合条件的内容。
示例输出文件内容
文件目录列表(只包含中文文件名):
Day01:
-笔记:
——python第一课.txt
-视频:
——01-认识Python_1.mp4
-代码:
——比较运算符.py
Day02:
-课件:
——第一章.pptx
-视频:
——02-第一个Python程序.mp4