輸出一個文件夾的所有目錄和文件結構
新建一個Python文件,輸入
這個文件表示查詢一個文件夾所有的目錄結構
import osdef print_directory_structure(root_dir):"""打印樹狀目錄結構(優化版)"""if not os.path.exists(root_dir):print(f"錯誤:路徑 {root_dir} 不存在")returnif not os.path.isdir(root_dir):print(f"錯誤:{root_dir} 不是一個目錄")returnroot_name = os.path.basename(os.path.normpath(root_dir))print(f"{root_name}/") # 根目錄標題# 遞歸輔助函數(處理層級縮進和符號)def traverse_dir(current_dir, prefix, is_last):"""current_dir: 當前遍歷的目錄路徑prefix: 層級前綴(用于繪制豎線/空格)is_last: 是否是父目錄的最后一個子項"""# 獲取當前目錄下的子目錄和文件(先目錄后文件)entries = sorted(os.listdir(current_dir), key=lambda x: (not os.path.isdir(os.path.join(current_dir, x)), x))dirs = [e for e in entries if os.path.isdir(os.path.join(current_dir, e))]files = [e for e in entries if not os.path.isdir(os.path.join(current_dir, e))]all_entries = dirs + files # 先目錄后文件的順序# 遍歷所有子項for i, entry in enumerate(all_entries):is_last_entry = (i == len(all_entries) - 1)entry_path = os.path.join(current_dir, entry)# 連接符號:最后一個項用└──,其他用├──connector = '└── ' if is_last_entry else '├── '# 顯示行(目錄加/,文件不加)line = f"{connector}{entry}/" if os.path.isdir(entry_path) else f"{connector}{entry}"print(f"{prefix}{line}")# 下一層級的前綴:如果當前是最后一個項,用空格;否則用豎線if not is_last_entry:next_prefix = prefix + "│ "else:next_prefix = prefix + " "# 遞歸處理子目錄(僅目錄需要繼續遍歷)if os.path.isdir(entry_path):traverse_dir(entry_path, next_prefix, is_last_entry)# 從根目錄的子項開始遞歸(根目錄本身已打印,前綴為空)traverse_dir(root_dir, "", is_last=True)if __name__ == "__main__":# 移除輸入路徑兩端的單引號和雙引號target_dir = input("請輸入文件夾路徑: ").strip().strip('"\'')print_directory_structure(target_dir)
運行文件
輸入文件夾路徑例如"C:\Users\86195\Desktop\java_demo\untitled1",輸入的路徑帶不帶雙引號都行
帶雙引號
不帶雙引號
進階操作
可以把一個文件夾a的目錄結構信息存到txt文件中,然后根據txt文件在任意文件夾b生成文件夾a以及它的子文件
新建Python文件1.py
這個文件表示查詢文件夾的所有目錄結構,把目錄結構信息輸出到控制臺和寫入txt文件,如果txt文件有內容就覆蓋
import osdef print_directory_structure(root_dir, output_file=None):"""打印樹狀目錄結構(支持輸出到文件)"""if not os.path.exists(root_dir):msg = f"錯誤:路徑 {root_dir} 不存在"print(msg)if output_file: print(msg, file=output_file)returnif not os.path.isdir(root_dir):msg = f"錯誤:{root_dir} 不是一個目錄"print(msg)if output_file: print(msg, file=output_file)returnroot_name = os.path.basename(os.path.normpath(root_dir))display_line = f"{root_name}/"print(display_line)if output_file: print(display_line, file=output_file) # 輸出到文件def traverse_dir(current_dir, prefix, is_last, output_file):entries = sorted(os.listdir(current_dir), key=lambda x: (not os.path.isdir(os.path.join(current_dir, x)), x))dirs = [e for e in entries if os.path.isdir(os.path.join(current_dir, e))]files = [e for e in entries if not os.path.isdir(os.path.join(current_dir, e))]all_entries = dirs + filesfor i, entry in enumerate(all_entries):is_last_entry = (i == len(all_entries) - 1)entry_path = os.path.join(current_dir, entry)connector = '└── ' if is_last_entry else '├── 'line = f"{connector}{entry}/" if os.path.isdir(entry_path) else f"{connector}{entry}"display_line = f"{prefix}{line}"print(display_line) # 輸出到控制臺if output_file: print(display_line, file=output_file) # 輸出到文件next_prefix = prefix + ("│ " if not is_last_entry else " ")if os.path.isdir(entry_path):traverse_dir(entry_path, next_prefix, is_last_entry, output_file)traverse_dir(root_dir, "", is_last=True, output_file=output_file)if __name__ == "__main__":target_dir = input("請輸入文件夾路徑(帶不帶雙引號均可): ").strip().strip('"')txt_path = input("請輸入txt文件保存路徑(帶不帶雙引號均可): ").strip().strip('"')# 打開文件并覆蓋寫入(若文件不存在則創建)with open(txt_path, 'w', encoding='utf-8') as f:print_directory_structure(target_dir, f)print(f"目錄結構已成功保存到 {txt_path}(文件已覆蓋)")
新建Python文件2.py
這個文件表示根據txt文件的信息在一個文件夾新建目錄結構
import os
import redef rebuild_from_txt(txt_path, target_parent_dir):"""根據txt文件重建目錄結構"""# 讀取并清洗txt內容with open(txt_path, 'r', encoding='utf-8') as f:lines = [line.rstrip('\n') for line in f if line.strip()] # 跳過空行if not lines:print("錯誤:txt文件內容為空")return# 解析根目錄(第一行必須是"根目錄名/")root_line = lines[0]if not root_line.endswith('/'):print(f"錯誤:txt文件格式錯誤,第一行應為根目錄(以/結尾),當前第一行:{root_line}")returnroot_dir_name = root_line[:-1] # 去除末尾的/target_root_dir = os.path.join(target_parent_dir, root_dir_name)# 創建根目錄(若已存在則跳過)try:os.makedirs(target_root_dir, exist_ok=True)print(f"創建根目錄:{target_root_dir}")except Exception as e:print(f"根目錄創建失敗:{e}")return# 維護當前層級的目錄棧(保存各層目錄名)dir_stack = [root_dir_name] # 初始為根目錄名# 正則匹配行結構(處理縮進和符號)line_pattern = re.compile(r'^(\s*)(├── |└── )(.*?)(/?)$')for line in lines[1:]: # 第一行已處理,從第二行開始match = line_pattern.match(line)if not match:print(f"警告:無法解析行(格式錯誤):{line},跳過")continueprefix_space, _, name, is_dir_flag = match.groups()is_dir = is_dir_flag == '/' # 目錄以/結尾# 計算當前層級(每個層級占4個字符:如"│ "或" ")current_depth = len(prefix_space) // 4 + 1 # 根目錄是層級0,子目錄層級從1開始# 調整目錄棧長度(確保棧長度等于當前層級)while len(dir_stack) > current_depth:dir_stack.pop() # 層級變淺,彈出深層目錄if len(dir_stack) < current_depth:print(f"警告:行結構不完整(層級跳躍):{line},跳過")continue# 拼接當前路徑current_parent = os.path.join(target_parent_dir, *dir_stack)current_path = os.path.join(current_parent, name)# 創建目錄或文件try:if is_dir:os.makedirs(current_path, exist_ok=True)dir_stack.append(name) # 目錄入棧,用于下一層級print(f"創建目錄:{current_path}")else:# 創建空文件(確保父目錄存在)os.makedirs(current_parent, exist_ok=True)with open(current_path, 'w', encoding='utf-8'):pass # 空文件print(f"創建文件:{current_path}")except Exception as e:print(f"創建失敗:{current_path},錯誤:{e}")if __name__ == "__main__":txt_path = input("請輸入txt文件路徑(帶不帶雙引號均可): ").strip().strip('"')target_parent = input("請輸入目標父文件夾路徑(帶不帶雙引號均可): ").strip().strip('"')rebuild_from_txt(txt_path, target_parent)print("目錄結構重建完成!")
新建txt文件
運行1.py文件
文件夾路徑例如我輸入
C:\Users\86195\Desktop\1新建文件夾\1
表示把文件夾1的目錄信息在控制臺輸出并且在txt文件中寫入,目錄信息包括文件夾1
所有輸入的文件路徑帶不帶雙引號都可以
運行2.py文件
例如目標父文件夾路徑我輸入
C:\Users\86195\Desktop\java_demo
會根據txt中的文件信息在java_demo文件夾下新建一個文件夾1和它的所有子文件