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.mzph.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 或更高版本 🔍 建议先运行检查命令…