Python+PyQt5实现文件夹结构映射工具

2025-05-21 02:50

本文主要是介绍Python+PyQt5实现文件夹结构映射工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下...

概述

在日常工作中,我们经常需要对文件夹结构进行复制和备份,比如仅复制一级目录,或者完整复制多级目录,有时还希望连同文件名及后缀创建空文件。手动操作既费时又容易出错。为了解决这个问题,本文将带来一款基于PyQt5开发的「文件夹结构映射工具」,支持拖拽选取路径,三种复制模式,操作简单直观,极大提升工作效率。

本工具代码精炼,功能实用,界面美观,适合文件管理、项目结构迁移、代码备份等多种场景使用。文章将深入解析程序设计思路、界面布局、功能实现,并附上完整源码下载,方便读者学习和二次开发。

功能亮点

路径拖拽与浏览双重选择:支持从资源管理器拖拽文件夹路径到输入框,也可以点击“浏览”按钮选择目录,操作灵活便捷。

多复制模式支持:

  • 仅复制一级目录结构(不进入子文件夹)
  • 复制多级目录结构(仅文件夹,无文件)
  • 复制多级目录结构并创建空文件(文件名与后缀保持一致)

路径有效性校验:自动检测源路径和目标路径是否合理,防止错误操作。

界面简洁美观:采用淡雅配色和流畅交互,按钮及控件布局合理,使用体验良好。

详细提示反馈:复制完成后弹窗显示创建文件夹数,异常情况及时警告。

展示效果

Python+PyQt5实现文件夹结构映射工具

Python+PyQt5实现文件夹结构映射工具

  • 左侧文本框支持拖拽粘贴目录路径
  • 右侧按钮可弹出系统文件夹选择窗口
  • 中间清晰显示复制模式单选选项
  • 右下角“开始映射结构”按钮启动复制
  • 复制完成弹窗告知成功与否

软件使用步骤

1.选择源路径

可直接拖拽文件夹至左侧输入框,或点击“浏览”按钮弹出选择窗口,选择想复制的文件夹。

2.选择目标路径

同样支持拖拽或浏览选择,指定复制结果保存位置。注意目标路径不能是源路径的子目录。

3.选择复制模式

  • 仅复制一级目录
  • 复制多级目录结构,不含文件
  • 复制多级目录结构并创建空文件
  • 根据需求选择。

4.点击“开始映射结构”

程序将按选定模式复制目录结构。完成后弹窗显示操作结果。

5.查看目标路径

目标路径将生成对应的目录结构(及空文件),验证复制是否正确。

代码解析

1. 主窗口设计(FolderCopyApp)

继承自QWidget,设置窗口标题、尺寸和基础样式,调用init_ui()方法构建界面。

self.setWindowTitle(" 文件夹结构映射工具")
self.setGeometry(300, 300, 600, 350)
self.setStyleSheet("""
    background-color: #f4f6f9;
    font-family: "Segoe UI";
    font-size:14px;
""")

2. 拖拽路径输入框(DropLineEdit)

继承自QLineEdit,重写dragEnterEvent和dropEvent实现路径拖拽识别,提升用户体验。

 def dragEnterEvent(self, e):
    if e.mimeData().hasUrls():
        e.accept()
    else:
        e.ignore()

def dropEvent(self, e):
    if e.mimeData().hasUrls():
        path = e.mimeData().urls()[0].toLocalFile()
        self.setText(path)

3. 界面布局与控件绑定

使用QvboxLayout整体垂直布局

每个路径输入区用QHBoxLayout横向放置文本框和浏览按钮

复制模式通过QGroupBox和QRadioButton呈现,默认选择一级目录复制

“开始映射结构”按钮绑定复制功能

self.copy_btn.clicked.connect(self.copy_structure)

4. 复制结构核心逻辑

copy_structure函数根据模式执行不同目录复制:

一级目录复制

 or name in os.listdir(source):
    full_path = os.path.join(source, name)
    if os.path.isdir(full_path):
        os.makedirs(os.path.join(target, name), exist_ok=True)

多级目录复制

for root, dirs, files in os.walk(source):
    rel_path = os.path.relpath(root, source)
    target_dir = os.path.join(target, rel_path)
    os.makedirs(target_dir, exist_ok=True)

- **多级目录复制 + 空文件**

if mode == "with_files":
    for file in files:
        open(os.path.join(target_dir, file), 'w').close()

5. 异常处理和提示

校验路径有效性,防止错误操作

捕获异常,弹窗反馈错误

复制完成后提示创建目录数量

源码下载

import sys
import os
from PyQt5.QtWidgets import (
    QApplication, QWidget, QLabel, QLineEdit, QPushButton,
    QVBoxLayout, QHBoxLayout, QFileDialog, QRadioButton,
    QGroupBox, QMessageBox
)
from PyQt5.QtCore import Qt

class DropLineEdit(QLineEdit):
    def __init__(self, *args):
        super().__init__(*args)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, e):
        if e.mimeData().hasUrls():
            e.accept()
        else:
            e.ignore()

    def dropEvent(self, e):
        if e.mimeData().hasUrls():
            path = e.mimeData().urls()[0].toLocalFile()
            self.setText(path)

class FolderCopyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(" 文件夹结构映射工具")
        self.setGeometry(300, 300, 600, 350)
        self.setStyleSheet("""
            background-color: #f4f6f9;
            font-family: "Segoe UI";
            font-size:14px;
        """)

        self.init_ui()

    def init_ui(self):
        layout = QVBoxLayout()

        # 源路径
        source_layout = QHBoxLayout()
        self.source_input = DropLineEdit()
        browse_source = QPushButton("浏览")
        browse_source.setFixedwidth(60)
        browse_source.setStyleSheet(self.button_style())
        browse_source.clicked.connect(self.select_source)
        self.add_field("源路径(拖拽或选择)", self.source_input, browse_source, layout, source_layout)

        # 目标路径
        target_layout = QHBoxLayout()
        self.target_input = DropLineEdit()
        browse_target = QPushButton("浏览")
        browse_target.setFixedWidth(60)
        browse_target.setStyleSheet(self.button_style())
        browse_target.clicked.connect(self.select_target)
        self.add_field("目标路径(拖拽或选择)", self.target_input, browse_target, layout, target_layout)

        # 模式选择
        self.mode_group = QGroupBox("选择复制模式")
        self.mode_group.setStyleSheet("QGroupBox { font-weight: bold; }")
        mode_layout = QVBoxLayout()
        self.level1_radio = QRadioButton("仅复制一级目录结构")
        self.multilevel_radio = QRadioButton("复制多级目录结构(不含文件)")
        self.with_files_radio = QRadioButton("复制多级结构 + 空文件(保留名称与后缀)")
        self.level1_radio.setChecked(True)
        mode_layout.addWidget(self.level1_radio)
        mode_layout.addWidget(self.multilevel_radio)
        mode_layout.addWidget(self.with_files_radio)
        self.mode_group.setLayout(mode_layout)
        layout.addWidget(self.mode_group)

        # 操作按钮
        self.copy_btn = QPushButton(" 开始映射结构")
        self.copy_btn.setStyleSheet(self.button_style())
        self.copy_btn.clicked.connect(self.copy_structure)
        layout.addWidget(self.copy_btn)

        self.setLayout(layout)

    def add_field(self, label_text, line_edit, button, layout, sublayout):
        label = QLabel(label_text)
        label.setStyleSheet("color: #333;")
        layout.addWidget(label)
        sublayout.addWidget(line_edit)
        sublayout.addWidget(button)
        layout.addLayout(sublayout)

    def button_style(self):
        return """
            QPushButton {
                background-color: #5c9ded;
                color: white;
                border: none;
                padding: 6px 12px;
         js       border-radius: 4px;
                font-family: "Segoe UI", "Roboto", "Helvetica Neue", Arial, sans-serif;
                font-weight: bold;
            }
            QPushButton:hover {
                background-color: #468be6;
            }
        """

    def select_source(self):
        path = QFileDialog.getExistingDirectory(self, js"选择源目录")
        if path:
            self.source_input.setText(path)

    def select_target(self):
        path = QFileDialog.getExistingDirectory(self, "选择目标目录")
        if path:
            self.target_input.setText(path)

    def copy_structure(self):
        source = self.souphprce_input.text().strip()
        target = self.target_input.text().strip()
        mode = "level1" if self.level1_radio.isChecked() else \
               "multilevel" if self.multilevel_radio.isChecked() else "with_files"

        if not source or not target:
            QMessageBo编程x.warning(self, "错误", "请设置源路径和目标路径")
            return

        if not os.path.exists(source):
            QMessageBox.warning(self, "错误", "源路径无效")
            return

        if os.path.commonpath([source]) == os.path.commonpath([source, target]):
            QMessageBox.warning(self, "错误", "目标路径不能位于源路径内部")
            return

        try:
            created = 0

            if mode == "level1":
                # 仅复制一级目录结构(直接子文件夹)
                for name in os.listdir(source):
                    full_path = os.path.join(source, name)
                    if os.path.isdir(full_path):
                        os.makedirs(os.path.join(target, name), exist_ok=True)
                        created += 1
            else:
                for root, dirs, files in os.walk(source):
                    rel_path = os.path.relpath(root, source)
                    target_dir = os.path.join(target, rel_path)
                    os.makedirs(target_dir, exist_ok=True)
                    created += 1

                    if mode == "with_files":
                        for file in files:
                            try:
                                open(os.path.join(target_dir, file), 'w').close()
                            except Exception as fe:
                                print(f"无法创建文件:{file}, 错误:{fe}")

         China编程   QMessageBox.information(self, "完成", f"结构复制完成,创建文件夹数:{created}")
        except Exception as e:
            QMessageBox.critical(self, "错误", str(e))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = FolderCopyApp()
    window.show()
    sys.exit(app.exec_())

总结

这款基于PyQt5的「文件夹结构映射工具」功能实用,代码清晰,界面友好,适合所有需要目录结构复制的场景。通过拖拽输入和多复制模式满足不同用户需求。本文不仅介绍了工具功能,还详细剖析了关键代码和实现细节。希望对您学习PyQt5 GUI开发、文件系统操作提供有价值的参考。

到此这篇关于python+PyQt5实现文件夹结构映射工具的文章就介绍到这了,更多相关Python文件夹结构映射内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Python+PyQt5实现文件夹结构映射工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154696

相关文章

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、