欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python開發(fā)一個文件夾文件名提取工具(附完整代碼)

 更新時間:2025年09月18日 09:13:14   作者:小莊-Python辦公  
這篇文章主要為大家詳細介紹了如何使用python開發(fā)一個文件夾文件名提取工具,專門用于提取文件夾中所有文件的名稱并導(dǎo)出為Excel格式,感興趣的小伙伴可以了解下

項目簡介

這是一個基于PyQt5開發(fā)的桌面應(yīng)用程序,專門用于提取文件夾中所有文件的名稱并導(dǎo)出為Excel格式。該工具支持拖拽操作,提供直觀的用戶界面,能夠遞歸遍歷文件夾結(jié)構(gòu),是文件管理和數(shù)據(jù)整理的實用工具。

主要功能特性

核心功能

  • 拖拽支持:直接將文件夾拖拽到應(yīng)用界面即可選擇目標文件夾
  • 遞歸遍歷:自動遍歷文件夾及其所有子文件夾
  • 文件統(tǒng)計:統(tǒng)計并顯示所有文件的詳細信息
  • Excel導(dǎo)出:將文件列表導(dǎo)出為Excel格式,便于后續(xù)處理
  • 目錄結(jié)構(gòu)顯示:按目錄層級組織顯示文件列表

用戶體驗

  • 可視化拖拽反饋:拖拽時提供綠色高亮效果
  • 實時狀態(tài)提示:清晰的操作提示和狀態(tài)反饋
  • 現(xiàn)代化界面:采用現(xiàn)代扁平化設(shè)計風(fēng)格
  • 響應(yīng)式布局:界面元素自適應(yīng)窗口大小

技術(shù)架構(gòu)

技術(shù)棧

  • GUI框架:PyQt5
  • 數(shù)據(jù)處理:pandas
  • 文件操作:Python標準庫 (os, pathlib)
  • 開發(fā)語言:Python 3.x

核心組件

1. FileListWidget 類

class FileListWidget(QTextEdit):
    """支持拖拽的文本顯示區(qū)域"""

主要職責(zé):

  • 處理拖拽事件(dragEnterEvent, dragLeaveEvent, dragMoveEvent, dropEvent)
  • 驗證拖拽內(nèi)容是否為文件夾
  • 提供視覺反饋效果
  • 存儲選中的文件夾路徑

關(guān)鍵特性:

  • 跨平臺兼容性:通過dragMoveEvent確保Windows平臺的拖拽穩(wěn)定性
  • 智能驗證:只接受文件夾類型的拖拽,拒絕文件拖拽
  • 視覺反饋:拖拽進入時顯示綠色邊框和背景色

2. MainWindow 類

class MainWindow(QMainWindow):
    """主窗口類"""

主要職責(zé):

  • 構(gòu)建用戶界面布局
  • 處理業(yè)務(wù)邏輯(文件遍歷、數(shù)據(jù)處理)
  • 管理用戶交互事件
  • 控制Excel導(dǎo)出功能

詳細功能說明

拖拽功能實現(xiàn)

拖拽事件處理流程

  • dragEnterEvent:檢測拖拽內(nèi)容是否包含本地文件夾
  • dragMoveEvent:在Windows平臺持續(xù)接受拖拽操作
  • dragLeaveEvent:恢復(fù)界面原始樣式
  • dropEvent:處理文件夾路徑并更新界面

關(guān)鍵代碼解析

def dragEnterEvent(self, event: QDragEnterEvent):
    if event.mimeData().hasUrls():
        urls = event.mimeData().urls()
        accept = False
        if urls:
            for url in urls:
                if url.isLocalFile():
                    file_path = url.toLocalFile()
                    if os.path.isdir(file_path):
                        accept = True
                        break
        
        if accept:
            # 設(shè)置拖拽高亮樣式
            self.setStyleSheet("""...""") 
            event.setDropAction(Qt.CopyAction)
            event.accept()

文件遍歷算法

使用Python的os.walk()方法實現(xiàn)遞歸文件遍歷:

def get_all_files(self, folder_path):
    file_list = []
    for root, dirs, files in os.walk(folder_path):
        relative_root = os.path.relpath(root, folder_path)
        if relative_root == '.':
            relative_root = '根目錄'
        
        for file in files:
            file_list.append({
                '目錄': relative_root,
                '文件名': file
            })
    return file_list

算法特點:

  • 遞歸遍歷所有子目錄
  • 記錄文件的相對路徑信息
  • 構(gòu)建結(jié)構(gòu)化數(shù)據(jù)便于后續(xù)處理

Excel導(dǎo)出功能

利用pandas庫實現(xiàn)Excel導(dǎo)出:

def export_to_excel(self):
    df = pd.DataFrame(self.file_data)
    df.to_excel(file_path, index=False, sheet_name='文件列表')

導(dǎo)出特性:

  • 支持自定義保存路徑
  • 包含目錄和文件名兩列數(shù)據(jù)
  • 提供操作成功/失敗反饋

界面設(shè)計

布局結(jié)構(gòu)

┌─────────────────────────────────────┐
│           應(yīng)用標題                    │
├─────────────────────────────────────┤
│                                     │
│         拖拽區(qū)域                     │
│    (支持文件夾拖拽)                   │
│                                     │
├─────────────────────────────────────┤
│  [獲取文件名]    [導(dǎo)出Excel]          │
├─────────────────────────────────────┤
│                                     │
│         結(jié)果顯示區(qū)域                  │
│                                     │
└─────────────────────────────────────┘

樣式設(shè)計

配色方案

  • 主色調(diào):綠色系 (#4CAF50) - 代表成功和自然
  • 輔助色:藍色系 (#2196F3) - 代表專業(yè)和信任
  • 背景色:淺灰色系 (#f0f0f0, #f9f9f9) - 提供舒適的視覺體驗

交互反饋

  • 拖拽狀態(tài):綠色虛線邊框 + 淺綠背景
  • 按鈕懸停:顏色加深效果
  • 禁用狀態(tài):灰色顯示

效果圖

完整代碼

import sys
import os
from pathlib import Path
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, 
    QWidget, QPushButton, QTextEdit, QLabel, QMessageBox,
    QFileDialog
)
from PyQt5.QtCore import Qt, QMimeData, QUrl
from PyQt5.QtGui import QDragEnterEvent, QDropEvent
import pandas as pd


class FileListWidget(QTextEdit):
    """支持拖拽的文本顯示區(qū)域"""
    
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setAcceptDrops(True)
        self.setReadOnly(True)
        self.setPlaceholderText("請將文件夾拖拽到此處...")
        self.folder_path = None
        
    def dragEnterEvent(self, event: QDragEnterEvent):
        print("拖拽進入事件觸發(fā)")  # 調(diào)試信息
        if event.mimeData().hasUrls():
            urls = event.mimeData().urls()
            print(f"檢測到URLs: {len(urls)}個")  # 調(diào)試信息
            
            accept = False
            if urls:
                for url in urls:
                    if url.isLocalFile():
                        file_path = url.toLocalFile()
                        print(f"檢查路徑: {file_path}")  # 調(diào)試信息
                        if os.path.isdir(file_path):
                            accept = True
                            break
            
            if accept:
                print("接受拖拽")  # 調(diào)試信息
                self.setStyleSheet("""
                    QTextEdit {
                        border: 2px dashed #4CAF50;
                        border-radius: 10px;
                        background-color: #e8f5e8;
                        font-size: 14px;
                        padding: 10px;
                    }
                """)
                event.setDropAction(Qt.CopyAction)
                event.accept()
            else:
                print("拒絕拖拽 - 沒有可用的目錄")  # 調(diào)試信息
                event.ignore()
        else:
            print("拒絕拖拽 - 沒有URL數(shù)據(jù)")  # 調(diào)試信息
            event.ignore()
            
    def dragLeaveEvent(self, event):
        # 恢復(fù)原始樣式
        self.setStyleSheet("""
            QTextEdit {
                border: 2px dashed #aaa;
                border-radius: 10px;
                background-color: #f9f9f9;
                font-size: 14px;
                padding: 10px;
            }
        """)
        super().dragLeaveEvent(event)
        
    def dragMoveEvent(self, event):
        # 某些平臺需要在dragMoveEvent中持續(xù)接受拖拽
        if event.mimeData().hasUrls():
            for url in event.mimeData().urls():
                if url.isLocalFile() and os.path.isdir(url.toLocalFile()):
                    event.setDropAction(Qt.CopyAction)
                    event.accept()
                    return
        event.ignore()
            
    def dropEvent(self, event: QDropEvent):
        print("拖拽放下事件觸發(fā)")  # 調(diào)試信息
        
        # 恢復(fù)原始樣式
        self.setStyleSheet("""
            QTextEdit {
                border: 2px dashed #aaa;
                border-radius: 10px;
                background-color: #f9f9f9;
                font-size: 14px;
                padding: 10px;
            }
        """)
        
        urls = event.mimeData().urls()
        print(f"放下時檢測到URLs: {len(urls) if urls else 0}個")  # 調(diào)試信息
        
        if urls:
            dropped_folder = None
            for url in urls:
                if url.isLocalFile():
                    p = url.toLocalFile()
                    print(f"放下的路徑候選: {p}")  # 調(diào)試信息
                    if os.path.isdir(p):
                        dropped_folder = p
                        break
            
            if dropped_folder:
                self.folder_path = dropped_folder
                self.setText(f"已選擇文件夾: {dropped_folder}")
                print(f"成功選擇文件夾: {dropped_folder}")  # 調(diào)試信息
                event.setDropAction(Qt.CopyAction)
                event.accept()
            else:
                print("錯誤: 沒有檢測到文件夾 (可能是文件或無效路徑)")  # 調(diào)試信息
                QMessageBox.warning(self, "警告", "請拖入文件夾,不是文件!")
                event.ignore()
        else:
            print("錯誤: 沒有URLs")  # 調(diào)試信息
            event.ignore()


class MainWindow(QMainWindow):
    """主窗口類"""
    
    def __init__(self):
        super().__init__()
        self.file_data = []  # 存儲文件信息的列表
        self.init_ui()
        
    def init_ui(self):
        """初始化用戶界面"""
        self.setWindowTitle("文件夾文件名提取工具")
        self.setGeometry(100, 100, 800, 600)
        
        # 創(chuàng)建中央部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        
        # 創(chuàng)建布局
        layout = QVBoxLayout(central_widget)
        
        # 標題標簽
        title_label = QLabel("文件夾文件名提取工具\n快捷方式無效")
        title_label.setAlignment(Qt.AlignCenter)
        title_label.setStyleSheet("font-size: 18px; font-weight: bold; margin: 10px;")
        layout.addWidget(title_label)
        
        # 拖拽區(qū)域
        self.file_list_widget = FileListWidget()
        self.file_list_widget.setMinimumHeight(200)
        self.file_list_widget.setStyleSheet("""
            QTextEdit {
                border: 2px dashed #aaa;
                border-radius: 10px;
                background-color: #f9f9f9;
                font-size: 14px;
                padding: 10px;
            }
        """)
        layout.addWidget(self.file_list_widget)
        
        # 按鈕布局
        button_layout = QHBoxLayout()
        
        # 獲取文件名按鈕
        self.get_files_btn = QPushButton("獲取文件名")
        self.get_files_btn.setStyleSheet("""
            QPushButton {
                background-color: #4CAF50;
                color: white;
                border: none;
                padding: 10px 20px;
                font-size: 14px;
                border-radius: 5px;
            }
            QPushButton:hover {
                background-color: #45a049;
            }
        """)
        self.get_files_btn.clicked.connect(self.get_files)
        button_layout.addWidget(self.get_files_btn)
        
        # 導(dǎo)出Excel按鈕
        self.export_btn = QPushButton("導(dǎo)出Excel")
        self.export_btn.setStyleSheet("""
            QPushButton {
                background-color: #2196F3;
                color: white;
                border: none;
                padding: 10px 20px;
                font-size: 14px;
                border-radius: 5px;
            }
            QPushButton:hover {
                background-color: #1976D2;
            }
        """)
        self.export_btn.clicked.connect(self.export_to_excel)
        self.export_btn.setEnabled(False)  # 初始狀態(tài)禁用
        button_layout.addWidget(self.export_btn)
        
        layout.addLayout(button_layout)
        
        # 結(jié)果顯示區(qū)域
        self.result_text = QTextEdit()
        self.result_text.setReadOnly(True)
        self.result_text.setPlaceholderText("文件列表將在這里顯示...")
        layout.addWidget(self.result_text)
        
    def get_all_files(self, folder_path):
        """遞歸獲取文件夾中的所有文件"""
        file_list = []
        
        try:
            for root, dirs, files in os.walk(folder_path):
                # 獲取相對于根文件夾的路徑
                relative_root = os.path.relpath(root, folder_path)
                if relative_root == '.':
                    relative_root = '根目錄'
                
                # 添加文件信息
                for file in files:
                    file_list.append({
                        '目錄': relative_root,
                        '文件名': file
                    })
                    
        except Exception as e:
            QMessageBox.critical(self, "錯誤", f"讀取文件夾時出錯: {str(e)}")
            return []
            
        return file_list
    
    def get_files(self):
        """獲取文件名按鈕點擊事件"""
        if not self.file_list_widget.folder_path:
            QMessageBox.warning(self, "警告", "請先拖入一個文件夾!")
            return
            
        # 獲取所有文件
        self.file_data = self.get_all_files(self.file_list_widget.folder_path)
        
        if not self.file_data:
            QMessageBox.information(self, "信息", "該文件夾中沒有找到任何文件。")
            return
            
        # 顯示結(jié)果
        result_text = f"共找到 {len(self.file_data)} 個文件:\n\n"
        
        # 按目錄分組顯示
        current_dir = None
        for item in self.file_data:
            if item['目錄'] != current_dir:
                current_dir = item['目錄']
                result_text += f"\n?? {current_dir}:\n"
            result_text += f"  ?? {item['文件名']}\n"
            
        self.result_text.setText(result_text)
        self.export_btn.setEnabled(True)  # 啟用導(dǎo)出按鈕
        
    def export_to_excel(self):
        """導(dǎo)出到Excel文件"""
        if not self.file_data:
            QMessageBox.warning(self, "警告", "沒有數(shù)據(jù)可以導(dǎo)出!")
            return
            
        # 選擇保存位置
        file_path, _ = QFileDialog.getSaveFileName(
            self, 
            "保存Excel文件", 
            "文件列表.xlsx", 
            "Excel文件 (*.xlsx);;所有文件 (*)"
        )
        
        if not file_path:
            return
            
        try:
            # 創(chuàng)建DataFrame
            df = pd.DataFrame(self.file_data)
            
            # 導(dǎo)出到Excel
            df.to_excel(file_path, index=False, sheet_name='文件列表')
            
            QMessageBox.information(
                self, 
                "成功", 
                f"文件已成功導(dǎo)出到:\n{file_path}\n\n共導(dǎo)出 {len(self.file_data)} 個文件記錄。"
            )
            
        except Exception as e:
            QMessageBox.critical(self, "錯誤", f"導(dǎo)出Excel時出錯: {str(e)}")


def main():
    """主函數(shù)"""
    app = QApplication(sys.argv)
    
    # 設(shè)置應(yīng)用程序樣式
    app.setStyleSheet("""
        QMainWindow {
            background-color: #f0f0f0;
        }
        QLabel {
            color: #333;
        }
        QTextEdit {
            background-color: white;
            border: 1px solid #ddd;
            border-radius: 5px;
            font-family: 'Microsoft YaHei', Arial, sans-serif;
        }
    """)
    
    window = MainWindow()
    window.show()
    
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

使用指南

安裝依賴

pip install PyQt5 pandas openpyxl

運行應(yīng)用

python main.py

操作步驟

  • 選擇文件夾:將目標文件夾拖拽到應(yīng)用的拖拽區(qū)域
  • 獲取文件列表:點擊"獲取文件名"按鈕開始掃描
  • 查看結(jié)果:在結(jié)果顯示區(qū)域查看文件列表
  • 導(dǎo)出數(shù)據(jù):點擊"導(dǎo)出Excel"按鈕保存結(jié)果

注意事項

  • 僅支持文件夾拖拽,不支持單個文件
  • 快捷方式無效,需要拖拽實際文件夾
  • 大型文件夾可能需要較長處理時間

技術(shù)亮點

1. 跨平臺拖拽兼容性

通過實現(xiàn)dragMoveEvent方法,確保在Windows平臺上的拖拽操作穩(wěn)定性:

def dragMoveEvent(self, event):
    if event.mimeData().hasUrls():
        for url in event.mimeData().urls():
            if url.isLocalFile() and os.path.isdir(url.toLocalFile()):
                event.setDropAction(Qt.CopyAction)
                event.accept()
                return
    event.ignore()

2. 健壯的錯誤處理

  • 文件訪問權(quán)限檢查
  • 路徑有效性驗證
  • 用戶友好的錯誤提示

3. 內(nèi)存優(yōu)化

  • 使用生成器模式處理大量文件
  • 及時釋放不需要的數(shù)據(jù)結(jié)構(gòu)
  • 避免重復(fù)加載文件信息

4. 調(diào)試支持

內(nèi)置詳細的調(diào)試日志輸出,便于問題排查:

print(f"檢測到URLs: {len(urls)}個")
print(f"檢查路徑: {file_path}")
print(f"成功選擇文件夾: {dropped_folder}")

擴展功能建議

短期優(yōu)化

  • 添加文件類型過濾功能
  • 支持多種導(dǎo)出格式(CSV、JSON)
  • 添加文件大小統(tǒng)計
  • 實現(xiàn)進度條顯示

長期規(guī)劃

  • 支持網(wǎng)絡(luò)文件夾
  • 添加文件預(yù)覽功能
  • 實現(xiàn)批量重命名
  • 集成云存儲服務(wù)

項目結(jié)構(gòu)

文件夾文件名提取工具/
├── main.py              # 主程序文件
├── requirements.txt     # 依賴包列表
├── README.md           # 項目說明
└── blog.md             # 技術(shù)博客(本文檔)

總結(jié)

這個文件夾文件名提取工具展示了PyQt5在桌面應(yīng)用開發(fā)中的強大能力。通過合理的架構(gòu)設(shè)計、用戶友好的界面和健壯的功能實現(xiàn),為用戶提供了一個實用的文件管理工具。

項目的技術(shù)特點包括:

  • 現(xiàn)代化的GUI設(shè)計:采用PyQt5構(gòu)建響應(yīng)式界面
  • 直觀的交互方式:支持拖拽操作,降低使用門檻
  • 完整的數(shù)據(jù)處理流程:從文件掃描到Excel導(dǎo)出的完整鏈路
  • 跨平臺兼容性:針對不同操作系統(tǒng)進行了優(yōu)化

該項目不僅解決了實際的文件管理需求,也為PyQt5桌面應(yīng)用開發(fā)提供了一個很好的參考案例。無論是對于學(xué)習(xí)GUI編程的開發(fā)者,還是需要文件管理工具的用戶,都具有很好的參考價值。

以上就是python開發(fā)一個文件夾文件名提取工具(附完整代碼)的詳細內(nèi)容,更多關(guān)于python文件名提取的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • pycharm上的python虛擬環(huán)境移到離線機器上的方法步驟

    pycharm上的python虛擬環(huán)境移到離線機器上的方法步驟

    本人在工作中需要在離線Windows環(huán)境中使用,本文主要介紹了pycharm上的python虛擬環(huán)境移到離線機器上的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2021-10-10
  • Python利用Faiss庫實現(xiàn)ANN近鄰搜索的方法詳解

    Python利用Faiss庫實現(xiàn)ANN近鄰搜索的方法詳解

    這篇文章主要介紹了Python利用Faiss庫實現(xiàn)ANN近鄰搜索的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python編程mac下使用pycharm小技巧

    Python編程mac下使用pycharm小技巧

    這篇文章主要介紹了Python編程中在mac下使用pycharm的一些小技巧,建議正在使用Pycharm的同學(xué)們可以收藏閱讀,可以節(jié)省你的編程時間
    2021-09-09
  • Keras搭建自編碼器操作

    Keras搭建自編碼器操作

    這篇文章主要介紹了Keras搭建自編碼器操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python使用python-can實現(xiàn)合并BLF文件

    Python使用python-can實現(xiàn)合并BLF文件

    python-can庫是 Python 生態(tài)中專注于 CAN 總線通信與數(shù)據(jù)處理的強大工具,本文將使用python-can為 BLF 文件合并提供高效靈活的解決方案,有需要的小伙伴可以了解下
    2025-07-07
  • Python中使用pip換源的流程分析

    Python中使用pip換源的流程分析

    pip是一個用于安裝、升級和管理Python庫的工具,它允許你從Python包索引(PyPI)下載和安裝第三方庫,在Python開發(fā)過程中,我們經(jīng)常需要安裝各種第三方庫,本文給大家分享Python中使用pip換源的詳細指南,感興趣的朋友一起看看吧
    2024-12-12
  • 舉例講解Python中is和id的用法

    舉例講解Python中is和id的用法

    這篇文章主要介紹了舉例講解Python中is和id的用法,是Python學(xué)習(xí)當中的基礎(chǔ)知識,作者舉例進行了簡單說明,需要的朋友可以參考下
    2015-04-04
  • Python使用BeautifulSoup庫解析網(wǎng)頁

    Python使用BeautifulSoup庫解析網(wǎng)頁

    在Python的網(wǎng)絡(luò)爬蟲中,網(wǎng)頁解析是一項重要的技術(shù)。而在眾多的網(wǎng)頁解析庫中,BeautifulSoup庫憑借其簡單易用而廣受歡迎,在本篇文章中,我們將學(xué)習(xí)BeautifulSoup庫的基本用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2023-08-08
  • Python中列表的基本操作匯總

    Python中列表的基本操作匯總

    這篇文章主要介紹了python中列表的一些基本操作,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-10-10
  • python中的十大%占位符對應(yīng)的格式化的使用方法

    python中的十大%占位符對應(yīng)的格式化的使用方法

    本文主要介紹了python中的十大%占位符對應(yīng)的格式化的使用方法,它可以很好的幫助我們解決一些字符串格式化的問題, 文中通過示例代碼介紹的非常詳細,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論