当前位置: 首页 > article >正文

对文件内的文件名生成目录,方便查阅

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)  # 执行函数

详细注释说明

  1. 中文筛选逻辑

    • 函数 contains_chinese 使用正则表达式判断文件名中是否包含中文字符,匹配 [\u4e00-\u9fff] 范围的字符。
  2. os.walk() 的作用

    • 遍历指定目录及其子目录,返回当前目录路径(root)、子目录列表(dirs)和文件列表(files)。
  3. 子目录分类

    • 通过判断目录路径中是否包含指定关键词(如 "笔记""代码"),为不同子目录生成对应的标题格式(如 "-笔记:")。
  4. 实时写入与控制台打印

    • 每次写入文件后,立即刷新缓冲区并强制写入磁盘:
      f.flush()
      os.fsync(f.fileno())
      
    • 同时将写入内容打印到控制台,便于调试和实时查看进度。
  5. Day 文件夹循环

    • 主目录中的子目录按名称排序,并筛选出以 "Day" 开头的文件夹进行处理。

代码执行流程

  1. 打开目标文件并写入标题。
  2. 遍历主目录中的 Day 文件夹,对每个 Day 文件夹写入标题。
  3. 遍历 Day 文件夹中的子目录和文件:
    • 根据目录名称分类(如 "-笔记:")。
    • 筛选出包含中文的文件,并以缩进格式写入。
  4. 每次写入后立即刷新文件内容,确保实时更新。
  5. 程序执行完毕后,生成文件包含所有符合条件的内容。

示例输出文件内容

文件目录列表(只包含中文文件名):

Day01:
-笔记:
 ——python第一课.txt

-视频:
 ——01-认识Python_1.mp4

-代码:
 ——比较运算符.py

Day02:
-课件:
 ——第一章.pptx

-视频:
 ——02-第一个Python程序.mp4

http://www.kler.cn/a/451119.html

相关文章:

  • 直流电源如何输出恒压源和恒流源
  • Arduino驱动DS18B20测量环境温度
  • 【知识】cuda检测GPU是否支持P2P通信及一些注意事项
  • 单片机:实现数码管动态显示(0~99999999)74hc138驱动(附带源码)
  • vue3标签中的ref属性如何使用$refs获取元素
  • 图书馆预约占座系统:数据驱动的座位分配机制
  • es快速扫描
  • 功能全面的跨平台笔记应用:Joplin,开源替代印象笔记与 OneNote
  • CentOS下,离线安装vscode的步骤;
  • Unity开发哪里下载安卓Android-NDK-r21d,外加Android Studio打包实验
  • 创建vue2项目或vue3项目超详细!
  • Spring Boot教程之三十一:入门 Web
  • [机器学习]XGBoost(2)——目标函数(公式详解)
  • Elasticsearch-脚本查询
  • 从测试服务器手动热部署到生产环境的实现
  • 个人笔记:ORM数据库框架EFCore使用示例,运行通过,附源码
  • LeetCode 59. 螺旋矩阵 II (C++实现)
  • 算法——二分查找
  • 图的最短路径(C++实现图【4】)
  • Docker、containerd、安全沙箱、社区Kata Containers运行对比
  • 【基于rust-wasm的前端页面转pdf组件和示例】
  • ant design学习记录:响应式尺寸头像大小 Avatar
  • react杂乱笔记(一)
  • 【数据库】SQL应该如何针对数据倾斜问题进行优化
  • 部署开源大模型的硬件配置全面指南
  • 【es6复习笔记】迭代器(10)