
本文介绍一种安全、健壮的Python方法,通过读取名称-路径映射文件(File 1),精准定位并替换目标文件(File 2)中所有 StaticMesh='NAME' 形式的占位符为对应完整路径,同时规避空行、空白符和索引越界等常见错误。
本文介绍一种安全、健壮的python方法,通过读取名称-路径映射文件(file 1),精准定位并替换目标文件(file 2)中所有 `staticmesh='name'` 形式的占位符为对应完整完整路径,同时规避空行、空白符和索引越界等常见错误。
在游戏资源自动化处理(如Unreal Engine蓝图或地图文件批量更新)中,常需将简写标识(如 Dog)替换为实际资产路径(如 /Game/Meshes/Bulldog)。原始脚本因未校验每行分割结果长度,遇到空行或仅含一个单词的行时触发 IndexError: list index out of range ——这是典型的“假设输入格式绝对规范”导致的鲁棒性缺失。
以下是优化后的完整解决方案,核心改进包括:
✅ 安全解析映射文件(跳过空行/注释,严格校验字段数)
✅ 使用字典而非元组列表提升查找效率(O(1) vs O(n))
✅ 精确正则匹配 StaticMesh=StaticMesh'xxx' 中的引号内内容
✅ 保留原文件结构(换行、缩进、非匹配行不变)
✅ 支持输出到新文件或覆盖原文件(推荐先备份)
import re
def main():
file_one = 'file-1.txt' # 格式:Name <space> FullPath(支持路径含空格)
file_two = 'file-2.txt' # 待处理的UE关卡/Actor数据文件
# 步骤1:安全构建名称→路径映射字典
name_to_path = {}
with open(file_one, 'r', encoding='utf-8') as f:
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line or line.startswith('#'): # 跳过空行和注释
continue
parts = line.split(maxsplit=1) # 仅按第一个空格分割,保留路径内空格
if len(parts) != 2:
print(f"警告:第{line_num}行格式错误,跳过 → '{line}'")
continue
name, path = parts[0].strip(), parts[1].strip()
if name and path:
name_to_path[name] = path
# 步骤2:逐行处理目标文件,精准替换
output_lines = []
pattern = r"(StaticMesh=StaticMesh')([^']+)(')" # 捕获三部分:前缀、名称、后缀
with open(file_two, 'r', encoding='utf-8') as f:
for line in f:
# 尝试匹配 StaticMesh=StaticMesh'xxx' 并替换其中的 xxx
match = re.search(pattern, line)
if match:
original_name = match.group(2)
if original_name in name_to_path:
new_line = f"{match.group(1)}{name_to_path[original_name]}{match.group(3)}"
output_lines.append(new_line)
else:
print(f"未找到映射:'{original_name}',保留原行")
output_lines.append(line.rstrip('\n'))
else:
output_lines.append(line.rstrip('\n')) # 非匹配行原样保留(含换行)
# 步骤3:写入结果(示例:输出到 file-2_updated.txt)
output_file = 'file-2_updated.txt'
with open(output_file, 'w', encoding='utf-8') as f:
f.write('\n'.join(output_lines))
print(f"✅ 处理完成!结果已保存至:{output_file}")
if __name__ == '__main__':
main()</space>
关键注意事项:
-
路径含空格处理:使用
line.split(maxsplit=1)替代line.split(),确保/Game/Meshes/My Mesh不被错误切分为两段; -
正则安全性:
([^']+)确保只捕获单引号内的内容,避免跨引号误匹配; -
编码兼容性:显式指定
encoding='utf-8'防止中文路径或特殊字符报错; - 调试友好:对缺失映射或格式错误行给出明确提示,便于快速定位数据问题;
-
生产建议:正式使用前,先用
filecmp或diff工具对比输出与原文件差异,确认替换逻辑符合预期。
此方案不仅解决了原始 IndexError,更构建了一个可维护、可扩展的资源映射处理框架,适用于大规模UE项目自动化管线。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











