python開發(fā)一個文件夾文件名提取工具(附完整代碼)
項目簡介
這是一個基于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)境移到離線機器上的方法步驟
本人在工作中需要在離線Windows環(huán)境中使用,本文主要介紹了pycharm上的python虛擬環(huán)境移到離線機器上的方法步驟,具有一定的參考價值,感興趣的可以了解一下2021-10-10
Python利用Faiss庫實現(xiàn)ANN近鄰搜索的方法詳解
這篇文章主要介紹了Python利用Faiss庫實現(xiàn)ANN近鄰搜索的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Python使用python-can實現(xiàn)合并BLF文件
python-can庫是 Python 生態(tài)中專注于 CAN 總線通信與數(shù)據(jù)處理的強大工具,本文將使用python-can為 BLF 文件合并提供高效靈活的解決方案,有需要的小伙伴可以了解下2025-07-07
Python使用BeautifulSoup庫解析網(wǎng)頁
在Python的網(wǎng)絡(luò)爬蟲中,網(wǎng)頁解析是一項重要的技術(shù)。而在眾多的網(wǎng)頁解析庫中,BeautifulSoup庫憑借其簡單易用而廣受歡迎,在本篇文章中,我們將學(xué)習(xí)BeautifulSoup庫的基本用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2023-08-08
python中的十大%占位符對應(yīng)的格式化的使用方法
本文主要介紹了python中的十大%占位符對應(yīng)的格式化的使用方法,它可以很好的幫助我們解決一些字符串格式化的問題, 文中通過示例代碼介紹的非常詳細,感興趣的小伙伴們可以參考一下2022-01-01

