Unity 資源合理性檢測

一:表格過度配置,表格資源是否在工程中存在,并輸出不存在的資源

import pandas as pd
import glob
import osassets = []
count = 0# 遍歷configs文件夾下所有xlsx文件
for file_path in glob.glob('configs/*.xlsx'):count += 1try:sheets = pd.read_excel(file_path, sheet_name=None)except Exception as e:print(f"讀取文件 {file_path} 時出錯:{e}")continue# 遍歷每個工作表for sheet_name, df in sheets.items():print('正在讀取文件:', file_path, 'sheet:', sheet_name)all_values = df.values.ravel()for value in all_values:if isinstance(value, str) and value.startswith('Assets/'):assets.append(value)# 寫入output.xlsx
output_path = "output.xlsx"
if os.path.exists(output_path):os.remove(output_path)if assets:df_output = pd.DataFrame(assets, columns=["Asset Path"])df_output.to_excel(output_path, index=False)print(f"\n結果已寫入 {output_path}")
else:print("\n未找到以'Assets/'開頭的內容")# 檢查文件是否存在并處理不存在的文件
not_exist_assets = []
for asset_path in assets:# 添加前綴../MainProject/并檢查路徑是否存在full_path = os.path.join('../MainProject', asset_path)if not os.path.exists(full_path):not_exist_assets.append(asset_path)not_exist_output = "FileNotExist.xlsx"
if not_exist_assets:if os.path.exists(not_exist_output):os.remove(not_exist_output)df_not_exist = pd.DataFrame(not_exist_assets, columns=["Asset Path"])df_not_exist.to_excel(not_exist_output, index=False)print(f"\n以下資源文件不存在,已寫入 {not_exist_output}:")for path in not_exist_assets:print(path)
else:print("\n所有資源文件均存在。")# 打印統計信息
print("\n匹配的內容列表:")
for item in assets:print(item)print("\n一共讀取了", count, "個文件,匹配到", len(assets), "條有效數據")

二:收集打包目錄

import os# 需要處理的文件列表
file_paths = [r'..\MainProject\Assets\Build\AssetBundle\AssetBundleConfig.asset',r'..\MainProject\Assets\Build\AssetBundle\SegmentedUpdateConfig.asset'
]
keys = []  # 存儲所有處理后的鍵值for file_path in file_paths:try:with open(file_path, 'r', encoding='utf-8') as file:print(f"\n{'='*50}")print(f"正在讀取文件:{os.path.abspath(file_path)}")print("-" * 50)file_keys = []  # 當前文件的臨時存儲for line_number, line in enumerate(file, 1):formatted_line = line.strip()# 關鍵字段提取邏輯if "Assets/" in formatted_line:# 清洗數據:移除 "- " 字符cleaned_key = formatted_line.replace("- ", "")file_keys.append(cleaned_key)print(f"[Line {line_number:03d}] 發現有效鍵 | 原始內容:{formatted_line} | 處理后:{cleaned_key}")else:print(f"[Line {line_number:03d}] {formatted_line}")keys.extend(file_keys)print(f"\n當前文件提取到 {len(file_keys)} 個有效鍵")except FileNotFoundError:print(f"錯誤:文件不存在 {os.path.abspath(file_path)}")except PermissionError:print(f"錯誤:沒有權限讀取文件 {file_path}")except UnicodeDecodeError:print(f"錯誤:文件編碼格式不支持,嘗試使用其他編碼(如utf-16)")except Exception as e:print(f"發生未知錯誤:{str(e)}")else:print("-" * 50)print(f"文件 {os.path.basename(file_path)} 處理完成")print("\n" + "="*50)
print(f"共處理 {len(file_paths)} 個文件,總計提取到 {len(keys)} 個有效鍵:")
for i, key in enumerate(keys, 1):print(f"{i:03d}. {key}")

三:是否進包,資源是否存在打包目錄

import pandas as pd
import glob
import os
from datetime import datetimedef clean_old_files():"""清理歷史文件"""target_files = ['keys.txt', '異常資源報告.xlsx']for file in target_files:try:os.remove(file)print(f" ? 已刪除舊文件:{file}")except FileNotFoundError:pass  # 靜默處理文件不存在的情況except Exception as e:print(f"?? 文件刪除異常:{file}")print(f"錯誤詳情:{str(e)}")def collect_assets():"""從Excel文件收集資源路徑"""assets = []file_count = 0print(f"\n{'='*50}")print("開始掃描Excel配置文件")print(f"掃描時間:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")for file_path in glob.glob('configs/*.xlsx'):file_count += 1try:sheets = pd.read_excel(file_path, sheet_name=None)filename = os.path.basename(file_path)print(f"\n? 正在處理:{filename}")for sheet_name, df in sheets.items():print(f" ├─ 工作表:{sheet_name}")all_values = df.values.ravel()for value in all_values:if isinstance(value, str) and value.startswith('Assets/'):assets.append({'file': filename,'sheet': sheet_name,'path': value})except Exception as e:print(f"\n?? 文件處理異常:{file_path}")print(f"錯誤詳情:{str(e)}")print(f"\n{'='*50}")print(f"掃描完成 | 處理文件:{file_count} 個 | 發現路徑:{len(assets)} 條")return assetsdef extract_keys(file_paths):"""提取并保存去重鍵值"""keys = []print(f"\n{'='*50}")print("開始解析關鍵鍵值")for path in file_paths:# 處理Excel文件if path.endswith('.xlsx'):print(f"\n? 解析Excel文件:{os.path.basename(path)}")try:df = pd.read_excel(path)excel_keys = df.iloc[:, 0].astype(str).dropna().tolist()keys.extend(excel_keys)print(f" ├─ 提取到 {len(excel_keys)} 條鍵值")for key in excel_keys[:3]:  # 顯示前3條示例print(f" │ 示例:{key[:60]}...")except Exception as e:print(f"\n?? Excel文件讀取失敗:{path}")print(f"錯誤詳情:{str(e)}")# 處理.asset文件elif path.endswith('.asset'):print(f"\n? 解析配置文件:{os.path.basename(path)}")try:with open(path, 'r', encoding='utf-8') as f:line_count = 0for line in f:line_count += 1clean_line = line.strip().replace("- ", "")if "Assets/" in clean_line:keys.append(clean_line)print(f" ├─ [L{line_count:03d}] 發現鍵值:{clean_line[:40]}...")except Exception as e:print(f"\n?? 文件讀取失敗:{path}")print(f"錯誤詳情:{str(e)}")# 去重并保存keys = list(set(keys))with open('keys.txt', 'w', encoding='utf-8') as f:f.write('\n'.join(keys))print(f"\n{'='*50}")print(f"解析完成 | 去重鍵值:{len(keys)} 條")print(f" ? 鍵值文件已保存:{os.path.abspath('keys.txt')}")return keysdef validate_assets(assets, keys):"""執行路徑校驗"""errors = []print(f"\n{'='*50}")print("開始校驗路徑完整性")print("\n校驗進度:")for idx, asset in enumerate(assets, 1):if not any(key in asset['path'] for key in keys):errors.append({'file': asset['file'],'sheet': asset['sheet'],'path': asset['path']})print(f" ? 已校驗 {idx}/{len(assets)} 條路徑", end='\r')print(f"\n\n{'='*50}")if errors:print(f"? 發現 {len(errors)} 條異常路徑:")for i, err in enumerate(errors[:5], 1):print(f" {i:02d}. 文件:{err['file']} | 工作表:{err['sheet']}\n 路徑:{err['path']}")if len(errors) > 5:print(f" ...(僅顯示前5條,共{len(errors)}條)")else:print("? 所有路徑均包含有效鍵值")return errorsdef main():# 初始化清理print(f"\n{'='*50}")print("開始清理歷史文件")clean_old_files()# 配置輸入路徑asset_files = [r'..\MainProject\Assets\Build\AssetBundle\AssetBundleConfig.asset',r'..\MainProject\Assets\Build\AssetBundle\SegmentedUpdateConfig.asset','代碼路徑.xlsx']# 執行數據收集assets = collect_assets()keys = extract_keys(asset_files)# 執行校驗errors = validate_assets(assets, keys)# 生成報告if errors:report_data = []for err in errors:report_data.append({'來源文件': err['file'],'工作表': err['sheet'],'資源路徑': err['path'],'校驗結果': 'Invalid'})report_df = pd.DataFrame(report_data)report_path = "異常資源報告.xlsx"report_df.to_excel(report_path, index=False)print(f"\n📊 異常報告已生成:{os.path.abspath(report_path)}")if __name__ == "__main__":main()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77533.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77533.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77533.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python爬蟲實戰:獲取高考資源網各學科精品復習資料

一、引言 高考資源網擁有豐富的高考復習資料,對于我們而言,獲取這些資源并整理分享能為考生提供有價值的幫助。然而,手動從網站查找和下載資源效率低且易出錯。利用 Python 爬蟲技術可實現自動化資源獲取,提高工作效率。但在爬取過程中,需考慮網站反爬機制,采取相應措施…

DuckDB:現代數據分析的“SQLite“內核革命

在數據工程、數據科學快速演進的今天,一個新的名字正在快速躥紅:DuckDB。 有人稱它是數據分析領域的SQLite,也有人稱它為下一代輕量級OLAP引擎。 無論哪種稱呼,都離不開一個事實: DuckDB 重新定義了小型數據倉庫和本地…

GIS開發筆記(16)解決基于osg和osgearth三維地圖上添加placeNode圖標點擊不易拾取的問題

一、實現效果 二、實現原理 在圖標添加的位置同時添加一個紅色圓球,半徑為5000~8000米,圖標和圓球掛接到同一個group節點,group節點再掛接到根節點,當點擊到圓球時,通過遍歷父節點就可以找到被點擊的圖標節點。 三、參考代碼 //添加圖標代碼 #pragma once #include &…

計算機網絡學習筆記 1-3章

第 1 章 計算機網絡體系結構 【考綱內容】 (一)計算機網絡概述 計算機網絡的概念、組成與功能;計算機網絡的分類; 計算機網絡的性能指標 (二)計算機網絡體系結構與參考模型 計算機網絡分層結構&#xff…

基于NVIDIA RTX 4090的COLMAP 3.7安裝指南:Ubuntu 20.04 + CUDA 11.8環境配置【2025最新版!!】

一、引言 三維重建技術作為計算機視覺領域的核心方向,在數字孿生、自動駕駛等領域具有重要應用價值。COLMAP作為開源的SfM(Structure-from-Motion)工具,其GPU加速特性可顯著提升重建效率。由于最新研究三維重建的需要&#xff08…

Spring Boot 依賴管理: `spring-boot-starter-parent` 與 `spring-boot-dependencies`

前言 在 Spring Boot 的開發實踐中,依賴管理是構建高質量應用的基礎。spring-boot-starter-parent 和 spring-boot-dependencies 是 Spring Boot 提供的兩大核心依賴管理工具,它們在簡化依賴版本控制、統一配置等方面發揮著關鍵作用。 一、核心概念解析…

【MySQL】基本查詢

目錄 增加 查詢 基本查詢 where子句 結果排序 篩選分頁結果 修改(更新) 刪除 普通刪除 截斷表 插入查詢結果 聚合函數 分組查詢 這一節的內容是對表內容的增刪查改,其中重點是表的查詢 增加 語法: INSERT [INTO] table_name [(column [, …

【C++詳解】C++入門(二)引用、內聯函數、nullptr宏

文章目錄 一、引用引用的概念和定義引用的功能引用的特性const引用const用法回顧權限的放大縮小const引用的功能 指針和引用的關系 二、內聯函數三、nullptr補充結構體指針變量類型重定義 一、引用 引用的概念和定義 C祖師爺為了優化在部分場景中使用指針會出現的效率較低和比…

畢業設計-基于深度學習的實時網絡入侵檢測系統

項目技術說明 深度學習實時網絡入侵檢測系統是一種利用深度學習技術對網絡流量進行實時分析,以識別和阻止潛在網絡攻擊的安全解決方案。相比傳統基于規則的入侵檢測系統(IDS),這種系統能夠通過學習網絡流量的正常模式和異常模式,更有效地檢測…

中藥企業數字化轉型:從傳統制造到智能制藥的跨越

在當今數字化浪潮下,中藥企業正積極擁抱變革,努力實現從傳統制造向智能制藥的跨越,以適應市場競爭和滿足人們對中藥質量與效率的更高要求。 在原料管理環節,企業通過采用物聯網技術,對中藥材種植、采集過程進行全程監…

Vue 2 的響應式 API 和 Vue 3 的組合式 API 的詳細對比,從核心機制、使用方式、代碼示例及優缺點展開

以下是 Vue 2 的響應式 API 和 Vue 3 的組合式 API 的詳細對比,從核心機制、使用方式、代碼示例及優缺點展開: 1. Vue 2 的響應式 API 核心機制 基于 Object.defineProperty: 通過劫持對象的 getter 和 setter 實現數據變化追蹤。限制&…

“八股訓練營”學習總結

在參加為期 40 天的八股訓練營的這段時間里,我收獲滿滿,不僅在知識技能上得到了提升,更在學習習慣和自我認知方面有了很大的進步。 在知識層面,訓練營涵蓋了網絡、數據庫、緩存以及python測試開發等多方面的知識點。 網絡方面&a…

Python對比兩張CAD圖并標記差異的解決方案

以下是使用Python對比兩張CAD圖并標記差異的解決方案,結合圖像處理和CAD結構分析: 一、環境準備與庫選擇 圖像處理庫:使用OpenCV進行圖像差異檢測、顏色空間轉換和輪廓分析。CAD解析庫:若為DXF格式,使用ezdxf解析實體…

記錄學習記錄學習《手動學習深度學習》這本書的筆記(九)

馬不停蹄地來到了第十二章:計算性能…… 感覺應該是講并行計算方面的,比如GPU、CPU、CUDA那些。 第十二章:計算性能 12.1 編譯器和解釋器 這里先提出了命令式編程和符號式編程的概念。 命令式編程VS符號式編程 目前為止,本書…

模板引擎語法-過濾器

模板引擎語法-過濾器 文章目錄 模板引擎語法-過濾器[toc]1.default過濾器2.default_if_none過濾器3.length過濾器4.addslashes過濾器5.capfirst過濾器6.cut過濾器7.date過濾器8.dictsort過濾器 1.default過濾器 default過濾器用于設置默認值。default過濾器對于變量的作用&…

make學習三:書寫規則

系列文章目錄 Make學習一:make初探 Make學習二:makefile組成要素 文章目錄 系列文章目錄前言默認目標規則語法order-only prerequisites文件名中的通配符偽目標 Phony Targets沒有 Prerequisites 和 recipe內建特殊目標名一個目標多條規則或多個目標共…

網絡安全技能大賽B模塊賽題解析Server12環境

已知靶機存在?站系統,使?Nmap?具掃描靶機端?,并將?站服務的端?號作為Flag (形式:Flag字符串)值提交 使用nmap掃描目標靶機網站服務的端口號為8089 Falg:8089 訪問?站/admin/pinglun.asp??&#…

1、Linux操作系統下,ubuntu22.04版本切換中英文界面

切換中英文界面的方法很多,我也是按照一個能用的方法弄過來并且記錄, 1.如果剛開始使用Ubuntu環境,桌面的語言環境為英文,需要安裝中文簡體的字體包 打開桌面終端,輸入 sudo apt install language-pack-zh-hans lan…

SmolVLM2: The Smollest Video Model Ever(六)

繼續微調 微調視頻的代碼如下: # 此Python文件用于對SmolVLM2進行視頻字幕任務的微調 # 導入所需的庫 import os os.environ["CUDA_VISIBLE_DEVICES"] "1" import torch from peft import LoraConfig, prepare_model_for_kbit_training, get…

Spring Boot安裝指南

🔖 Spring Boot安裝指南 🌱 Spring Boot支持兩種使用方式: 1?? 可作為常規Java開發工具使用 2?? 可作為命令行工具安裝 ?? 安裝前提: 📌 系統需安裝 Java SDK 17 或更高版本 🔍 建議先運行檢查命令…