最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+PyQt5實(shí)現(xiàn)文件夾結(jié)構(gòu)映射工具

 更新時(shí)間:2025年05月20日 15:50:13   作者:創(chuàng)客白澤  
在日常工作中,我們經(jīng)常需要對(duì)文件夾結(jié)構(gòu)進(jìn)行復(fù)制和備份,本文將帶來一款基于PyQt5開發(fā)的文件夾結(jié)構(gòu)映射工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

概述

在日常工作中,我們經(jīng)常需要對(duì)文件夾結(jié)構(gòu)進(jìn)行復(fù)制和備份,比如僅復(fù)制一級(jí)目錄,或者完整復(fù)制多級(jí)目錄,有時(shí)還希望連同文件名及后綴創(chuàng)建空文件。手動(dòng)操作既費(fèi)時(shí)又容易出錯(cuò)。為了解決這個(gè)問題,本文將帶來一款基于PyQt5開發(fā)的「文件夾結(jié)構(gòu)映射工具」,支持拖拽選取路徑,三種復(fù)制模式,操作簡單直觀,極大提升工作效率。

本工具代碼精煉,功能實(shí)用,界面美觀,適合文件管理、項(xiàng)目結(jié)構(gòu)遷移、代碼備份等多種場景使用。文章將深入解析程序設(shè)計(jì)思路、界面布局、功能實(shí)現(xiàn),并附上完整源碼下載,方便讀者學(xué)習(xí)和二次開發(fā)。

功能亮點(diǎn)

路徑拖拽與瀏覽雙重選擇:支持從資源管理器拖拽文件夾路徑到輸入框,也可以點(diǎn)擊“瀏覽”按鈕選擇目錄,操作靈活便捷。

多復(fù)制模式支持:

  • 僅復(fù)制一級(jí)目錄結(jié)構(gòu)(不進(jìn)入子文件夾)
  • 復(fù)制多級(jí)目錄結(jié)構(gòu)(僅文件夾,無文件)
  • 復(fù)制多級(jí)目錄結(jié)構(gòu)并創(chuàng)建空文件(文件名與后綴保持一致)

路徑有效性校驗(yàn):自動(dòng)檢測源路徑和目標(biāo)路徑是否合理,防止錯(cuò)誤操作。

界面簡潔美觀:采用淡雅配色和流暢交互,按鈕及控件布局合理,使用體驗(yàn)良好。

詳細(xì)提示反饋:復(fù)制完成后彈窗顯示創(chuàng)建文件夾數(shù),異常情況及時(shí)警告。

展示效果

  • 左側(cè)文本框支持拖拽粘貼目錄路徑
  • 右側(cè)按鈕可彈出系統(tǒng)文件夾選擇窗口
  • 中間清晰顯示復(fù)制模式單選選項(xiàng)
  • 右下角“開始映射結(jié)構(gòu)”按鈕啟動(dòng)復(fù)制
  • 復(fù)制完成彈窗告知成功與否

軟件使用步驟

1.選擇源路徑

可直接拖拽文件夾至左側(cè)輸入框,或點(diǎn)擊“瀏覽”按鈕彈出選擇窗口,選擇想復(fù)制的文件夾。

2.選擇目標(biāo)路徑

同樣支持拖拽或?yàn)g覽選擇,指定復(fù)制結(jié)果保存位置。注意目標(biāo)路徑不能是源路徑的子目錄。

3.選擇復(fù)制模式

  • 僅復(fù)制一級(jí)目錄
  • 復(fù)制多級(jí)目錄結(jié)構(gòu),不含文件
  • 復(fù)制多級(jí)目錄結(jié)構(gòu)并創(chuàng)建空文件
  • 根據(jù)需求選擇。

4.點(diǎn)擊“開始映射結(jié)構(gòu)”

程序?qū)催x定模式復(fù)制目錄結(jié)構(gòu)。完成后彈窗顯示操作結(jié)果。

5.查看目標(biāo)路徑

目標(biāo)路徑將生成對(duì)應(yīng)的目錄結(jié)構(gòu)(及空文件),驗(yàn)證復(fù)制是否正確。

代碼解析

1. 主窗口設(shè)計(jì)(FolderCopyApp)

繼承自QWidget,設(shè)置窗口標(biāo)題、尺寸和基礎(chǔ)樣式,調(diào)用init_ui()方法構(gòu)建界面。

self.setWindowTitle("?? 文件夾結(jié)構(gòu)映射工具")
self.setGeometry(300, 300, 600, 350)
self.setStyleSheet("""
    background-color: #f4f6f9;
    font-family: "Segoe UI";
    font-size:14px;
""")

2. 拖拽路徑輸入框(DropLineEdit)

繼承自QLineEdit,重寫dragEnterEvent和dropEvent實(shí)現(xiàn)路徑拖拽識(shí)別,提升用戶體驗(yàn)。

 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整體垂直布局

每個(gè)路徑輸入?yún)^(qū)用QHBoxLayout橫向放置文本框和瀏覽按鈕

復(fù)制模式通過QGroupBox和QRadioButton呈現(xiàn),默認(rèn)選擇一級(jí)目錄復(fù)制

“開始映射結(jié)構(gòu)”按鈕綁定復(fù)制功能

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

4. 復(fù)制結(jié)構(gòu)核心邏輯

copy_structure函數(shù)根據(jù)模式執(zhí)行不同目錄復(fù)制:

一級(jí)目錄復(fù)制

 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)

多級(jí)目錄復(fù)制

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)

- **多級(jí)目錄復(fù)制 + 空文件**

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

5. 異常處理和提示

校驗(yàn)路徑有效性,防止錯(cuò)誤操作

捕獲異常,彈窗反饋錯(cuò)誤

復(fù)制完成后提示創(chuàng)建目錄數(shù)量

源碼下載

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("?? 文件夾結(jié)構(gòu)映射工具")
        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)

        # 目標(biāo)路徑
        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("目標(biāo)路徑(拖拽或選擇)", self.target_input, browse_target, layout, target_layout)

        # 模式選擇
        self.mode_group = QGroupBox("選擇復(fù)制模式")
        self.mode_group.setStyleSheet("QGroupBox { font-weight: bold; }")
        mode_layout = QVBoxLayout()
        self.level1_radio = QRadioButton("僅復(fù)制一級(jí)目錄結(jié)構(gòu)")
        self.multilevel_radio = QRadioButton("復(fù)制多級(jí)目錄結(jié)構(gòu)(不含文件)")
        self.with_files_radio = QRadioButton("復(fù)制多級(jí)結(jié)構(gòu) + 空文件(保留名稱與后綴)")
        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("?? 開始映射結(jié)構(gòu)")
        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;
                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, "選擇源目錄")
        if path:
            self.source_input.setText(path)

    def select_target(self):
        path = QFileDialog.getExistingDirectory(self, "選擇目標(biāo)目錄")
        if path:
            self.target_input.setText(path)

    def copy_structure(self):
        source = self.source_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:
            QMessageBox.warning(self, "錯(cuò)誤", "請(qǐng)?jiān)O(shè)置源路徑和目標(biāo)路徑")
            return

        if not os.path.exists(source):
            QMessageBox.warning(self, "錯(cuò)誤", "源路徑無效")
            return

        if os.path.commonpath([source]) == os.path.commonpath([source, target]):
            QMessageBox.warning(self, "錯(cuò)誤", "目標(biāo)路徑不能位于源路徑內(nèi)部")
            return

        try:
            created = 0

            if mode == "level1":
                # 僅復(fù)制一級(jí)目錄結(jié)構(gòu)(直接子文件夾)
                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"無法創(chuàng)建文件:{file}, 錯(cuò)誤:{fe}")

            QMessageBox.information(self, "完成", f"結(jié)構(gòu)復(fù)制完成,創(chuàng)建文件夾數(shù):{created}")
        except Exception as e:
            QMessageBox.critical(self, "錯(cuò)誤", str(e))

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

總結(jié)

這款基于PyQt5的「文件夾結(jié)構(gòu)映射工具」功能實(shí)用,代碼清晰,界面友好,適合所有需要目錄結(jié)構(gòu)復(fù)制的場景。通過拖拽輸入和多復(fù)制模式滿足不同用戶需求。本文不僅介紹了工具功能,還詳細(xì)剖析了關(guān)鍵代碼和實(shí)現(xiàn)細(xì)節(jié)。希望對(duì)您學(xué)習(xí)PyQt5 GUI開發(fā)、文件系統(tǒng)操作提供有價(jià)值的參考。

到此這篇關(guān)于Python+PyQt5實(shí)現(xiàn)文件夾結(jié)構(gòu)映射工具的文章就介紹到這了,更多相關(guān)Python文件夾結(jié)構(gòu)映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何利用Matplotlib庫繪制動(dòng)畫及保存GIF圖片

    如何利用Matplotlib庫繪制動(dòng)畫及保存GIF圖片

    這篇文章主要給大家介紹了關(guān)于如何利用Matplotlib庫繪制動(dòng)畫及保存GIF圖片的相關(guān)資料,matplotlib模塊提供了很高級(jí)和非常友好的使用方式,使用起來也是非常方便的,需要的朋友可以參考下
    2021-06-06
  • 詳解Python中行列式的計(jì)算

    詳解Python中行列式的計(jì)算

    矩陣的行列式是僅與方陣相關(guān)的標(biāo)量,?這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)行列式的計(jì)算,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Pandas創(chuàng)建DataFrame提示:type?object?'object'?has?no?attribute?'dtype'解決方案

    Pandas創(chuàng)建DataFrame提示:type?object?'object'?has?n

    Pandas數(shù)據(jù)幀(DataFrame)是二維數(shù)據(jù)結(jié)構(gòu),它包含一組有序的列,每列可以是不同的數(shù)據(jù)類型,這篇文章主要給大家介紹了關(guān)于Pandas創(chuàng)建DataFrame提示:type?object?‘object‘?has?no?attribute?‘dtype‘的解決方案,需要的朋友可以參考下
    2023-02-02
  • Windows和Linux下使用Python搭建一個(gè)圖片OCR工具

    Windows和Linux下使用Python搭建一個(gè)圖片OCR工具

    本文介紹了如何在?Windows?和?Linux?系統(tǒng)?下,基于?Python?3.10?虛擬環(huán)境,搭建一個(gè)用于?OCR(PaddleOCR?/?PaddleX)與?PDF?處理?的?Python?運(yùn)行環(huán)境
    2026-01-01
  • Python在6個(gè)人工智能領(lǐng)域的實(shí)際應(yīng)用示例代碼

    Python在6個(gè)人工智能領(lǐng)域的實(shí)際應(yīng)用示例代碼

    Python在人工智能(AI)領(lǐng)域得到了廣泛的應(yīng)用,從機(jī)器學(xué)習(xí)到深度學(xué)習(xí),從自然語言處理到計(jì)算機(jī)視覺,Python提供了豐富的庫和框架,使得開發(fā)者能夠快速實(shí)現(xiàn)各種AI應(yīng)用,本文將通過多個(gè)實(shí)際案例,展示Python在人工智能領(lǐng)域的強(qiáng)大功能和應(yīng)用前景
    2025-08-08
  • Pytorch GPU內(nèi)存占用很高,但是利用率很低如何解決

    Pytorch GPU內(nèi)存占用很高,但是利用率很低如何解決

    這篇文章主要介紹了Pytorch GPU內(nèi)存占用很高,但是利用率很低的原因及解決方法,具有很好的參考價(jià)值,希望對(duì)大家 有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • python pandas中索引函數(shù)loc和iloc的區(qū)別分析

    python pandas中索引函數(shù)loc和iloc的區(qū)別分析

    在數(shù)據(jù)分析過程中,很多時(shí)候我們需要從數(shù)據(jù)表中提取出我們需要的部分,而這么做的前提是我們需要先索引出這一部分?jǐn)?shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python pandas中索引函數(shù)loc和iloc區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 基于Python編寫簡單實(shí)用的日志裝飾器

    基于Python編寫簡單實(shí)用的日志裝飾器

    在寫代碼的時(shí)候,往往會(huì)漏掉日志這個(gè)關(guān)鍵因素,導(dǎo)致功能在使用的時(shí)候出錯(cuò)卻無法溯源。這個(gè)時(shí)候只要利用日志裝飾器就能解決,本文將用Python自制一個(gè)簡單實(shí)用的日志裝飾器,需要的可以參考一下
    2022-05-05
  • python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽事件處理機(jī)制詳細(xì)介紹與實(shí)例解析

    python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽事件處理機(jī)制詳細(xì)介紹與實(shí)例解析

    這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽事件處理機(jī)制詳細(xì)介紹與實(shí)例解析,需要的朋友可以參考下
    2020-03-03
  • python中WSGI是什么,Python應(yīng)用WSGI詳解

    python中WSGI是什么,Python應(yīng)用WSGI詳解

    這篇文章主要介紹一下python中的WSGI, 小編在網(wǎng)上找了幾篇非常好的關(guān)于WSGI介紹,整理一下分享給大家。
    2017-11-11

最新評(píng)論

额济纳旗| 彰化县| 项城市| 安乡县| 临沂市| 南靖县| 靖州| 双峰县| 武强县| 合川市| 黎城县| 麻城市| 登封市| 邯郸市| 富阳市| 五峰| 黄骅市| 黑山县| 古蔺县| 乐山市| 紫阳县| 尼勒克县| 肇庆市| 东方市| 宁阳县| 莱西市| 邹平县| 阿拉善左旗| 瑞安市| 垦利县| 开化县| 改则县| 报价| 宾川县| 大新县| 无极县| 堆龙德庆县| 搜索| 仁怀市| 曲麻莱县| 卢氏县|