当前位置:首页>python>《彻底告别手动建文件夹:python智能解析文件名分隔符,自动递归创建层级目录,秒级效率!》

《彻底告别手动建文件夹:python智能解析文件名分隔符,自动递归创建层级目录,秒级效率!》

  • 2026-09-07 15:36:43
《彻底告别手动建文件夹:python智能解析文件名分隔符,自动递归创建层级目录,秒级效率!》

“带你横跨办公自动化的数据江海”

@摸鱼

前言

关于摸鱼

(

ABOUT MOYU

)

闻道有先后,术业有专攻。

各位大佬朋友们好!

~我依旧是你们的老朋友摸鱼~

在职场摸爬滚打的这十多年里,我用Python悄悄干了不少“正事”——不知不觉攒下了一整套办公自动化的实用项目技巧。去年10月初创立了公众号 「码海听潮」 ,初衷很简单:把重复的劳动交给代码,把摸鱼的时间留给生活。

目前已经吭哧吭哧更新了140多篇原创文章,每一篇都是实操干货,不讲虚的,只聊怎么用代码真正解放双手,帮大家早点下班、准点摸鱼

《办公需求表述:》

       有一个神秘的根目录文件夹,里面有多个递归的子文件夹和图片文件,图片文件名有统一的命名规律,文件名由多个“-”连字符连接,例如4-1-1-001.bmp、1-1-1-001.bmp、2-1-1-001.bmp...,现在的要求是按"-"连字符分割文件名,依据分割后的层级递归创建文件夹结构,并将图片文件移动到最大层级的文件夹中。以4-1-1-001.bmp这个文件为例,按"-"连字符分割文件名

4为第一层文件夹、4-1为第二层文件夹,4-1-1为第三层文件夹、4-1-1-001.bmp是第三层文件夹的图片文件,要是这种类似的需求你的Big Boss安排你去完成,请问阁下该如何应对?

《该办公问题痛点分析:》

1. 效率低下 ⏰

  • 痛点:手动创建成百上千个文件夹,每个文件都需要单独处理

  • 示例:1000个图片文件,人工需要创建几千个文件夹

  • 影响:浪费大量时间在重复性工作上

2. 容易出错 ❌

  • 痛点:人工操作容易看错文件名、创建错误的文件夹层级

  • 示例:4-1-1 和 4-1-2 容易混淆,可能放错位置

  • 影响:文件错乱,后续查找困难

3.缺乏批量处理能力 📊

  • 痛点:无法同时处理多个文件夹和文件

  • 示例:根目录下有多个子文件夹,需要逐个处理

  • 影响:处理周期长,工作效率低

《该办公问题拆解思路:》

《该办公工具成品展示:》

《该办公工具核心功能亮点:》

01

 亮点一:智能文件名解析引擎智🤖

        • 多分隔符支持:支持 -、_、. 及自定义分隔符

        • 智能层级识别:自动解析文件名中的层级结构

        • 灵活分割规则:支持任意深度的文件层级

        02

         亮点二:双模式组织策略📄

            • 简单模式:需要清晰独立层级

            • 累积模式:需要保留完整路径信息

            03

            亮点三:智能文件筛选🚀

            • 筛选方式:精确匹配、多格式组合、通配符

              《该办公工具代码展示:》

              下面,我就奉上python代码让各位大佬见识一下,什么叫"传统文化"遇上"赛博效率"

              import sysfrom PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,                              QHBoxLayout, QLabel, QLineEdit, QPushButton,                              QGroupBox, QRadioButton, QComboBox, QTextEdit,                             QFileDialog, QMessageBox)from PyQt6.QtCore import Qt, QThread, pyqtSignalfrom PyQt6.QtGui import QIconclass FileOrganizerGUI(QMainWindow):    def __init__(self):        super().__init__()        self.init_ui()    def init_ui(self):        self.setWindowTitle("文件组织工具 - File Organizer")        self.setFixedSize(750, 720)        # 设置样式        self.setStyleSheet("""            QMainWindow {                background-color: #f0f2f5;            }            QLabel {                color: #2c3e50;                font-size: 13px;            }            QPushButton {                background-color: #3498db;                color: white;                border: none;                padding: 8px 20px;                border-radius: 6px;                font-size: 13px;                font-weight: bold;            }            QPushButton:hover {                background-color: #2980b9;            }            QPushButton:pressed {                background-color: #21618c;            }            QPushButton:disabled {                background-color: #bdc3c7;                color: #7f8c8d;            }            QLineEdit {                padding: 8px 12px;                border: 2px solid #dcdde1;                border-radius: 6px;                font-size: 13px;                background-color: white;            }            QLineEdit:focus {                border-color: #3498db;            }            QComboBox {                padding: 8px 12px;                border: 2px solid #dcdde1;                border-radius: 6px;                font-size: 13px;                background-color: white;                min-width: 120px;            }            QComboBox:hover {                border-color: #3498db;            }            QTextEdit {                border: 2px solid #dcdde1;                border-radius: 6px;                font-size: 12px;                font-family: 'Consolas', 'Courier New', monospace;                background-color: #fafafa;            }            QGroupBox {                font-weight: bold;                border: 2px solid #dcdde1;                border-radius: 8px;                margin-top: 10px;                padding-top: 10px;                background-color: white;            }            QGroupBox::title {                subcontrol-origin: margin;                left: 10px;                padding: 0 10px 0 10px;                color: #2c3e50;            }            QRadioButton {                font-size: 13px;                color: #2c3e50;                spacing: 8px;            }            QRadioButton::indicator {                width: 18px;                height: 18px;            }        """)        # 中央部件        central_widget = QWidget()        self.setCentralWidget(central_widget)        main_layout = QVBoxLayout()        main_layout.setSpacing(15)        main_layout.setContentsMargins(25, 25, 25, 25)        central_widget.setLayout(main_layout)        # 设置区域        settings_group = QGroupBox("设置")        settings_layout = QVBoxLayout()        settings_group.setLayout(settings_layout)        # 根目录选择        root_dir_layout = QHBoxLayout()        root_dir_label = QLabel("📁 根目录:")        root_dir_label.setFixedWidth(80)        root_dir_layout.addWidget(root_dir_label)        self.root_dir_edit = QLineEdit()        self.root_dir_edit.setPlaceholderText("请选择要处理的根目录...")        root_dir_layout.addWidget(self.root_dir_edit)        self.browse_root_btn = QPushButton("浏览...")        self.browse_root_btn.setFixedWidth(100)        self.browse_root_btn.clicked.connect(self.browse_root_directory)        root_dir_layout.addWidget(self.browse_root_btn)        settings_layout.addLayout(root_dir_layout)        # 保存目录选择(独立于根目录)        save_dir_layout = QHBoxLayout()        save_dir_label = QLabel("💾 保存目录:")        save_dir_label.setFixedWidth(80)        save_dir_layout.addWidget(save_dir_label)        self.save_dir_edit = QLineEdit()        self.save_dir_edit.setPlaceholderText("请选择保存组织后文件的目录...")        save_dir_layout.addWidget(self.save_dir_edit)        self.browse_save_btn = QPushButton("浏览...")        self.browse_save_btn.setFixedWidth(100)        self.browse_save_btn.clicked.connect(self.browse_save_directory)        save_dir_layout.addWidget(self.browse_save_btn)        settings_layout.addLayout(save_dir_layout)        # 文件和分隔符 - 水平紧凑布局        options_layout = QHBoxLayout()        options_layout.setSpacing(30)        # 模式选择        mode_group = QGroupBox("组织模式")        mode_group.setStyleSheet("""            QGroupBox {                font-weight: bold;                border: 2px solid #dcdde1;                border-radius: 8px;                margin-top: 10px;                padding-top: 10px;                background-color: white;                margin-right: 0px;            }            QGroupBox::title {                subcontrol-origin: margin;                left: 10px;                padding: 0 10px 0 10px;                color: #2c3e50;            }        """)        mode_layout = QVBoxLayout()        mode_group.setLayout(mode_layout)        self.simple_radio = QRadioButton("简单模式 - 每层单独命名")        self.simple_radio.setToolTip("例: 4-1-1-001.bmp → 4/1/1/")        self.cumulative_radio = QRadioButton("累积模式 - 每层包含完整路径")        self.cumulative_radio.setToolTip("例: 4-1-1-001.bmp → 4/4-1/4-1-1/")        self.cumulative_radio.setChecked(True)        mode_layout.addWidget(self.simple_radio)        mode_layout.addWidget(self.cumulative_radio)        options_layout.addWidget(mode_group)        # 分隔符选择        sep_group = QGroupBox("文件名分隔符")        sep_group.setStyleSheet("""            QGroupBox {                font-weight: bold;                border: 2px solid #dcdde1;                border-radius: 8px;                margin-top: 10px;                padding-top: 10px;                background-color: white;                margin-left: 0px;            }            QGroupBox::title {                subcontrol-origin: margin;                left: 10px;                padding: 0 10px 0 10px;                color: #2c3e50;            }        """)        sep_layout = QVBoxLayout()        sep_group.setLayout(sep_layout)        sep_combo_layout = QHBoxLayout()        self.sep_combo = QComboBox()        self.sep_combo.addItems(['- (连字符)', '_ (下划线)', '. (点)', '自定义'])        sep_combo_layout.addWidget(self.sep_combo)        self.sep_custom_edit = QLineEdit()        self.sep_custom_edit.setPlaceholderText("输入自定义分隔符")        self.sep_custom_edit.setFixedWidth(130)        self.sep_custom_edit.setEnabled(False)        sep_combo_layout.addWidget(self.sep_custom_edit)        sep_layout.addLayout(sep_combo_layout)        self.sep_combo.currentIndexChanged.connect(self.on_separator_changed)        options_layout.addWidget(sep_group)        options_layout.addStretch()        settings_layout.addLayout(options_layout)        # 文件后缀筛选        ext_layout = QHBoxLayout()        ext_label = QLabel("📄 文件后缀:")        ext_label.setFixedWidth(80)        ext_layout.addWidget(ext_label)        self.ext_edit = QLineEdit()        self.ext_edit.setPlaceholderText("例如: .bmp, .jpg, .png (多个用逗号分隔,留空则处理所有文件)")        ext_layout.addWidget(self.ext_edit)        settings_layout.addLayout(ext_layout)        main_layout.addWidget(settings_group)        # 日志区域        log_group = QGroupBox("操作日志")        log_layout = QVBoxLayout()        log_group.setLayout(log_layout)        self.log_text = QTextEdit()        self.log_text.setReadOnly(True)        self.log_text.setMaximumHeight(420)        self.log_text.setStyleSheet("""            QTextEdit {                background-color: #fafafa;                line-height: 1.5;            }        """)        log_layout.addWidget(self.log_text)        # 底部控制栏 - 四个按钮居中        bottom_widget = QWidget()        bottom_layout = QHBoxLayout()        bottom_widget.setLayout(bottom_layout)        # 清除日志按钮        self.clear_btn = QPushButton("🗑 清除日志")        self.clear_btn.clicked.connect(self.clear_log)        self.clear_btn.setStyleSheet("""            QPushButton {                background-color: #95a5a6;                padding: 8px 20px;                min-width: 100px;            }            QPushButton:hover {                background-color: #7f8c8d;            }        """)        bottom_layout.addWidget(self.clear_btn)        # 执行移动按钮        self.execute_btn = QPushButton("▶ 执行递归创建文件夹且移动文件")        self.execute_btn.setStyleSheet("""            QPushButton {                background-color: #e74c3c;                padding: 8px 20px;                min-width: 120px;            }            QPushButton:hover {                background-color: #c0392b;            }        """)        bottom_layout.addWidget(self.execute_btn)        # 撤销按钮        self.undo_btn = QPushButton("↩ 撤销")        self.undo_btn.setEnabled(False)        self.undo_btn.setStyleSheet("""            QPushButton {                background-color: #3498db;                padding: 8px 20px;                min-width: 100px;            }            QPushButton:hover {                background-color: #2980b9;            }            QPushButton:enabled {                background-color: #f39c12;            }            QPushButton:enabled:hover {                background-color: #e67e22;            }        """)        bottom_layout.addWidget(self.undo_btn)        # 停止按钮        self.stop_btn = QPushButton("⏹ 停止")        self.stop_btn.setEnabled(False)        self.stop_btn.setStyleSheet("""            QPushButton {                background-color: #95a5a6;                padding: 8px 20px;                min-width: 100px;            }            QPushButton:hover {                background-color: #7f8c8d;            }            QPushButton:enabled {                background-color: #e67e22;            }            QPushButton:enabled:hover {                background-color: #d35400;            }        """)        bottom_layout.addWidget(self.stop_btn)        # 让四个按钮整体居中        bottom_layout.insertStretch(0)        bottom_layout.insertStretch(5)        log_layout.addWidget(bottom_widget)        main_layout.addWidget(log_group)    def on_separator_changed(self, index):        if index == 3:  # 自定义            self.sep_custom_edit.setEnabled(True)            self.sep_custom_edit.setFocus()        else:            self.sep_custom_edit.setEnabled(False)    def browse_root_directory(self):        dir_path = QFileDialog.getExistingDirectory(self, "选择根目录(扫描文件的目录)")        if dir_path:            self.root_dir_edit.setText(dir_path)    def browse_save_directory(self):        dir_path = QFileDialog.getExistingDirectory(self, "选择保存目录(存放组织后文件的目录)")        if dir_path:            self.save_dir_edit.setText(dir_path)    def clear_log(self):        self.log_text.clear()def main():    app = QApplication(sys.argv)    app.setStyle('Fusion')    app.setWindowIcon(QIcon())    window = FileOrganizerGUI()    window.show()    sys.exit(app.exec())if __name__ == "__main__":    main()

              这款根据文件名命名规递归创建文件夹工具,可自动完成原需手动逐个创建文件夹、反复移动文件、来回切换目录一整天的文件整理工作。从面对成百上千个图片文件逐个分析命名、手动创建层级文件夹、不断重复机械操作的繁琐与崩溃,到用工具实现选择根目录、一键启动、自动解析文件名层级、智能创建文件夹结构并自动归类文件,工作效率获得指数级提升,终于解放了双手和时间!

              大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。

              结语

              当Python遇见办公,牛马打工人终于笑出了猪叫声

              【职场人必看】每天早上一睁眼,想到又要面对:

              1.📊 堆积如山的Excel表格

              2.📑 机械重复的复制粘贴

              3.✍️ 永远改不完的各类文档

              4.诸如此类的更多........

              是不是连Ctrl+Alt+Delete的心都有了?

              别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!

              本篇文章代码和exe已经上传nas私有云盘,有需要的大佬私信摸鱼本鱼获取......

              最后感谢各位大佬观看,还望各位大佬抬抬贵手一键三连,多多关注点赞转发评论,大佬们的支持才是摸鱼孜孜不倦更新原创干货的动力!

              最新文章

              随机文章