使用python快速生成nodejs項目文件結(jié)構(gòu)
項目概述
本文將詳細介紹一個主要是為了解決AI Studio生成的Node.js程序的存放文件夾并快速生成問題的工具軟件。功能有:文件夾結(jié)構(gòu)的創(chuàng)建、瀏覽、文件內(nèi)容的查看與編輯等功能,適合作為文件管理工具或項目結(jié)構(gòu)生成器使用。
運行結(jié)果

功能特性
核心功能
- 文件夾選擇與瀏覽:可視化選擇目標文件夾
- 結(jié)構(gòu)化創(chuàng)建:根據(jù)文本描述批量創(chuàng)建文件夾和文件
- 樹形展示:以樹形結(jié)構(gòu)展示目錄層級
- 文件編輯:支持文件內(nèi)容的查看與編輯
- 備注管理:提供備注列表功能,支持剪貼板操作
- 配置持久化:自動保存和恢復(fù)用戶配置
技術(shù)架構(gòu)
使用的技術(shù)棧
- Python 3.x
- wxPython:GUI框架
- 標準庫:os, re, json, subprocess, platform
程序結(jié)構(gòu)
FileManagerFrame (主窗口類)
├── 界面初始化
├── 事件處理方法
├── 文件操作方法
└── 配置管理方法
代碼詳解
1. 類初始化與界面布局
class FileManagerFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='文件管理器', size=(1200, 800))
設(shè)計思路:
- 使用雙面板布局(左右分欄)
- 左側(cè):文件夾操作、結(jié)構(gòu)輸入、樹形展示、備注列表
- 右側(cè):文件內(nèi)容編輯區(qū)
關(guān)鍵組件:
# 主要的UI組件 self.folder_text # 顯示目標文件夾路徑 self.memo1 # 輸入文件夾結(jié)構(gòu) self.tree_ctrl # 樹形控件,展示目錄結(jié)構(gòu) self.memo2 # 文件內(nèi)容編輯器 self.listbox1 # 備注列表 self.edit1 # 備注輸入框
2. 文件夾選擇功能
def on_select_folder(self, event):
dlg = wx.DirDialog(self, "選擇目標文件夾", style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
self.target_folder = dlg.GetPath()
self.folder_text.SetValue(self.target_folder)
dlg.Destroy()
技術(shù)要點:
- 使用
wx.DirDialog提供原生的文件夾選擇對話框 - 選擇后不立即加載樹形結(jié)構(gòu),避免大文件夾導(dǎo)致卡頓
- 通過
dlg.Destroy()手動釋放對話框資源
3. 文件夾結(jié)構(gòu)解析算法
這是程序的核心算法之一,用于解析樹形文本結(jié)構(gòu):
def parse_folder_structure(self, structure_text):
lines = structure_text.strip().split('\n')
structure = []
root_name = None
for i, line in enumerate(lines):
# 移除樹形字符 (│├└─)
clean_line = re.sub(r'^[│├└─\s]+', '', line).strip()
# 提取名稱(去掉注釋)
name = clean_line.split('(')[0].strip()
is_folder = name.endswith('/')
name = name.rstrip('/')
if i == 0:
root_name = name
structure.append({
'name': name,
'is_folder': True,
'level': 0
})
else:
# 計算層級(通過樹形字符數(shù)量)
tree_chars = len(line) - len(line.lstrip('│├└─ \t'))
level = tree_chars // 4 + 1 # 每4個字符一個層級
structure.append({
'name': name,
'is_folder': is_folder,
'level': level
})
return structure, root_name
算法解析:
1.正則表達式清理:
r'^[│├└─\s]+'匹配行首的樹形字符- 去除這些字符后得到純粹的文件/文件夾名
2.層級計算:
- 通過計算樹形字符的數(shù)量來確定層級
- 每4個字符代表一個縮進層級
- 例:
├── file.txt的層級為 1
3.文件夾識別:
- 以
/結(jié)尾的視為文件夾 - 其他視為文件
4.注釋處理:
- 支持在名稱后添加括號注釋
- 如:
server.js (后端入口)
4. 文件系統(tǒng)創(chuàng)建算法
def create_from_structure(self, structure, base_path):
path_stack = [base_path] # 使用棧維護當(dāng)前路徑
for i, item in enumerate(structure):
name = item['name']
is_folder = item['is_folder']
level = item['level']
if i == 0:
continue # 跳過根節(jié)點
# 根據(jù)層級調(diào)整路徑棧
while len(path_stack) > level:
path_stack.pop()
# 構(gòu)建當(dāng)前路徑
current_path = os.path.join(path_stack[-1], name)
if is_folder:
os.makedirs(current_path, exist_ok=True)
path_stack.append(current_path) # 文件夾入棧
else:
# 創(chuàng)建文件
parent_dir = os.path.dirname(current_path)
if parent_dir:
os.makedirs(parent_dir, exist_ok=True)
with open(current_path, 'w', encoding='utf-8') as f:
pass # 創(chuàng)建空文件
數(shù)據(jù)結(jié)構(gòu):路徑棧
路徑棧是這個算法的關(guān)鍵:
作用:維護當(dāng)前所在的文件夾路徑
操作:
- 遇到文件夾:入棧
- 層級減?。撼鰲5綄?yīng)層級
示例:
my-project/ level=0 棧:[base_path]
├── src/ level=1 棧:[base_path, src]
│ └── main.js level=2 棧:[base_path, src]
└── public/ level=1 棧:[base_path, public] (src出棧)
└── index.html level=2 棧:[base_path, public]
5. 樹形控件填充
def populate_tree(self, parent_item, path, depth=0, max_depth=10):
if depth >= max_depth:
return # 防止遞歸過深
try:
items = sorted(os.listdir(path))
folders = []
files = []
# 分類文件和文件夾
for item in items:
if len(item) > 0 and item[0] == '.':
continue # 跳過隱藏文件
if len(item) > 0 and item[0] == '$':
continue # 跳過系統(tǒng)文件
item_path = os.path.join(path, item)
try:
if os.path.isdir(item_path):
folders.append((item, item_path))
else:
files.append((item, item_path))
except (PermissionError, OSError):
continue
# 先顯示文件夾
for item_name, item_path in folders:
display_name = '[DIR] ' + item_name
child = self.tree_ctrl.AppendItem(parent_item, display_name)
self.tree_ctrl.SetItemData(child, item_path)
self.populate_tree(child, item_path, depth + 1, max_depth)
# 再顯示文件
for item_name, item_path in files:
display_name = '[FILE] ' + item_name
child = self.tree_ctrl.AppendItem(parent_item, display_name)
self.tree_ctrl.SetItemData(child, item_path)
except (PermissionError, OSError):
pass
設(shè)計亮點:
- 深度限制:
max_depth=10防止目錄層級過深導(dǎo)致性能問題 - 分類顯示:文件夾優(yōu)先顯示,便于瀏覽
- 數(shù)據(jù)關(guān)聯(lián):使用
SetItemData將完整路徑與樹節(jié)點關(guān)聯(lián) - 異常處理:優(yōu)雅處理權(quán)限錯誤
6. 文件內(nèi)容讀寫
def load_file_content(self, file_path):
"""加載文件內(nèi)容 - 支持多種編碼"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
self.memo2.SetValue(content)
except Exception:
try:
# 嘗試GBK編碼(兼容中文Windows)
with open(file_path, 'r', encoding='gbk') as f:
content = f.read()
self.memo2.SetValue(content)
except Exception as e:
self.memo2.SetValue('無法讀取文件內(nèi)容: ' + str(e))
def on_save_file(self, event):
"""保存文件內(nèi)容"""
if not self.current_file:
wx.MessageBox('請先選擇一個文件', '提示', wx.OK | wx.ICON_INFORMATION)
return
try:
content = self.memo2.GetValue()
with open(self.current_file, 'w', encoding='utf-8') as f:
f.write(content)
wx.MessageBox('保存成功!', '提示', wx.OK | wx.ICON_INFORMATION)
except Exception as e:
wx.MessageBox('保存失敗: ' + str(e), '錯誤', wx.OK | wx.ICON_ERROR)
編碼兼容性處理:
- 優(yōu)先嘗試UTF-8編碼
- 失敗后嘗試GBK編碼(兼容舊版Windows中文文件)
- 最后顯示錯誤信息
7. 配置持久化
def save_config(self):
"""保存配置到JSON文件"""
config = {
'target_folder': self.target_folder,
'listbox_items': [self.listbox1.GetString(i)
for i in range(self.listbox1.GetCount())]
}
try:
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(config, f, ensure_ascii=False, indent=2)
except Exception as e:
print('保存配置失敗: ' + str(e))
def load_config(self):
"""程序啟動時加載配置"""
if os.path.exists(self.config_file):
try:
with open(self.config_file, 'r', encoding='utf-8') as f:
config = json.load(f)
self.target_folder = config.get('target_folder', '')
self.folder_text.SetValue(self.target_folder)
listbox_items = config.get('listbox_items', [])
for item in listbox_items:
self.listbox1.Append(item)
except Exception as e:
print('加載配置失敗: ' + str(e))
配置項:
- 目標文件夾路徑
- 備注列表內(nèi)容
優(yōu)勢:
- 使用JSON格式,易讀易維護
ensure_ascii=False保證中文正確保存- 程序重啟后自動恢復(fù)上次狀態(tài)
8. 系統(tǒng)集成功能
def on_open_folder(self, event):
"""調(diào)用系統(tǒng)文件管理器打開文件夾"""
if not self.target_folder or not os.path.exists(self.target_folder):
wx.MessageBox('請先選擇有效的目標文件夾', '提示', wx.OK | wx.ICON_INFORMATION)
return
try:
if platform.system() == 'Windows':
os.startfile(self.target_folder)
elif platform.system() == 'Darwin': # macOS
subprocess.Popen(['open', self.target_folder])
else: # Linux
subprocess.Popen(['xdg-open', self.target_folder])
except Exception as e:
wx.MessageBox('打開文件夾失敗: ' + str(e), '錯誤', wx.OK | wx.ICON_ERROR)
跨平臺兼容性:
- Windows:使用
os.startfile() - macOS:調(diào)用
open命令 - Linux:調(diào)用
xdg-open命令
使用場景
1. 項目模板生成
快速創(chuàng)建標準項目結(jié)構(gòu):
my-project/
├── src/
│ ├── main.js
│ └── utils.js
├── public/
│ └── index.html
├── package.json
└── README.md
2. 批量文件管理
- 瀏覽大型項目目錄
- 快速定位和編輯文件
- 查看文件內(nèi)容而不離開程序
3. 文檔整理
- 創(chuàng)建文檔目錄結(jié)構(gòu)
- 統(tǒng)一管理項目文檔
- 記錄備注信息
性能優(yōu)化
1. 延遲加載
wx.CallAfter(self.refresh_tree) # 異步刷新,避免阻塞
2. 深度限制
max_depth=10 # 限制遞歸深度
3. 過濾系統(tǒng)文件
if item[0] == '.' or item[0] == '$':
continue # 跳過不必要的文件
潛在改進方向
1. 功能增強
- 支持文件搜索功能
- 添加文件拖拽功能
- 支持多文件批量編輯
- 增加文件預(yù)覽(圖片、PDF等)
- 添加文件對比功能
2. 用戶體驗
- 添加快捷鍵支持
- 支持主題切換
- 添加最近打開列表
- 支持書簽功能
- 增加操作歷史記錄
3. 性能優(yōu)化
- 虛擬樹(大目錄優(yōu)化)
- 文件內(nèi)容緩存
- 多線程加載
- 增量更新樹節(jié)點
4. 擴展功能
- 支持Git集成
- 添加文本比較工具
- 支持正則表達式搜索
- 添加代碼高亮顯示
- 支持插件系統(tǒng)
常見問題與解決方案
Q1: 中文亂碼問題
解決:使用多編碼嘗試機制,優(yōu)先UTF-8,備選GBK
Q2: 大文件夾加載慢
解決:
- 延遲加載,不自動刷新
- 限制遞歸深度
- 跳過隱藏文件
Q3: 樹節(jié)點展開報錯
解決:移除 wx.TR_HIDE_ROOT 樣式,顯示根節(jié)點
Q4: 配置文件損壞
解決:使用 try-except 包裹配置加載,失敗時使用默認值
到此這篇關(guān)于使用python快速生成nodejs項目文件結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)python生成項目文件結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
3小時快速搭建AI系統(tǒng)權(quán)限控制的保姆級教程
本文提供一個3小時快速搭建AI系統(tǒng)權(quán)限控制的保姆級教程,幫助開發(fā)者避免類似Meta的數(shù)據(jù)泄露事故,教程分兩個階段:15分鐘的環(huán)境準備(安裝Python、PostgreSQL、Redis等)和60分鐘的核心架構(gòu)搭建,核心部分包括設(shè)計AI資產(chǎn)分類模型(如訓(xùn)練數(shù)據(jù)、模型參數(shù)等)和用戶角色體系2026-03-03
Python調(diào)用Java可執(zhí)行jar包問題
這篇文章主要介紹了Python調(diào)用Java可執(zhí)行jar包問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
關(guān)于Python的一些學(xué)習(xí)總結(jié)
這篇文章主要介紹了關(guān)于Python的一些總結(jié),希望自己以后在學(xué)習(xí)Python的過程中可以邊學(xué)習(xí)邊總結(jié),就自己之前的學(xué)習(xí)先做以總結(jié),之后將不斷總結(jié)更新2018-05-05
淺談python opencv對圖像顏色通道進行加減操作溢出
這篇文章主要介紹了淺談python opencv對圖像顏色通道進行加減操作溢出,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python數(shù)據(jù)分析之使用scikit-learn構(gòu)建模型
這篇文章主要介紹了Python數(shù)據(jù)分析之使用scikit-learn構(gòu)建模型,sklearn提供了model_selection模型選擇模塊、preprocessing數(shù)據(jù)預(yù)處理模塊、decompisition特征分解模塊,更多相關(guān)內(nèi)容需要朋友可以參考下面文章內(nèi)容2022-08-08

