
本文介绍一种健壮的Python方案,用于读取名称-路径映射表(File 1),精准替换目标配置文件(File 2)中所有 StaticMesh='NAME' 行为对应路径,有效规避空行、空格分隔异常导致的 IndexError。
本文介绍一种健壮的python方案,用于读取名称-路径映射表(file 1),精准替换目标配置文件(file 2)中所有 `staticmesh='name'` 行为对应路径,有效规避空行、空格分隔异常导致的 `indexerror`。
在游戏开发或Unreal Engine资源自动化处理中,常需将文本配置中简写的资产名(如 'Dog')批量替换为完整资源路径(如 '/Game/Meshes/Bulldog')。但原始脚本因未校验每行切分结果长度,在遇到空行、仅含一个字段或含多余空格的行时,words[1] 会触发 IndexError: list index out of range。
根本问题在于:line.split() 对空行返回空列表 [],对单字段行返回单元素列表(如 ['Cat']),此时访问 words[1] 必然越界。正确的做法是先验证字段数量,再安全提取键值对。
以下是优化后的完整可运行脚本,具备容错性、清晰逻辑和生产级鲁棒性:
import re
def main():
file_one = 'file-1.txt'
file_two = 'file-2.txt'
# 构建名称→路径映射字典(安全解析)
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: # 跳过空行
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
# 逐行处理目标文件,执行替换
output_lines = []
with open(file_two, 'r', encoding='utf-8') as f:
for line in f:
# 精确匹配 StaticMesh=StaticMesh'XXX' 模式(支持等号可选)
match = re.search(r"StaticMesh\s*=\s*StaticMesh'([^']+)'", line)
if not match:
output_lines.append(line.rstrip('\n')) # 保持原格式(含换行)
continue
quoted_name = match.group(1)
if quoted_name in name_to_path:
new_path = name_to_path[quoted_name]
# 替换整个 StaticMesh=... 部分,避免误改其他内容
replaced = re.sub(
r"(StaticMesh\s*=\s*StaticMesh)'[^']+'",
r"\1'" + new_path + "'",
line
)
output_lines.append(replaced.rstrip('\n'))
else:
output_lines.append(line.rstrip('\n'))
# 输出结果(或写入新文件)
for line in output_lines:
print(line)
if __name__ == '__main__':
main()✅ 关键改进点说明:
立即学习“Python免费学习笔记(深入)”;
-
安全解析映射表:使用
split(maxsplit=1)确保路径中空格不被错误切分;显式检查len(parts) >= 2并跳过异常行;支持 UTF-8 编码。 -
精准正则匹配:
r"StaticMesh\s*=\s*StaticMesh'([^']+)'容忍等号两侧空格,并捕获单引号内非引号字符,避免误匹配嵌套结构。 -
原子化替换:用
re.sub替换整条StaticMesh=...语句,而非简单str.replace(),防止路径名冲突(如'Dog'被误替'Dog.Dog'中的子串)。 - 友好提示:对格式错误的映射行打印警告并继续执行,不中断流程。
⚠️ 注意事项:
- 若 File 1 中存在重复名称(如两行都以
Dog开头),后出现的路径将覆盖前者;如需报错,可在插入字典前添加if name in name_to_path: raise ValueError(...)。 - 此脚本默认输出到控制台;若需保存为新文件,将最后循环替换为:
with open('file-2_updated.txt', 'w', encoding='utf-8') as out_f: out_f.write('\n'.join(output_lines)) - Unreal Engine 资源路径通常区分大小写,请确保 File 1 中的名称与 File 2 中
StaticMesh'...'内的名称严格一致。
该方案兼顾准确性、可维护性与错误容忍度,适用于中大型资源批量更新场景。


















