
本文介绍如何修正 Python 脚本,使其能正确在大量 Minecraft 模组(JAR 文件)中定位 coal.json 等资源文件,核心在于统一使用正斜杠 / 表示 ZIP 内部路径,避免因路径分隔符不匹配导致搜索失败。
本文介绍如何修正 python 脚本,使其能正确在大量 minecraft 模组(jar 文件)中定位 `coal.json` 等资源文件,核心在于统一使用正斜杠 `/` 表示 zip 内部路径,避免因路径分隔符不匹配导致搜索失败。
JAR 文件本质上是 ZIP 归档格式,其内部路径始终以正斜杠 / 分隔(如 data/c/tags/item/coal.json),而 Windows 系统默认使用反斜杠 。原脚本中定义的 target_path = "data\c\tags\item\" 生成了形如 datac agsitemcoal.json 的字符串,与 ZIP 内部实际路径不一致,导致 entry == ... 比较永远为 False,因此搜索始终返回空结果。
关键修复:统一使用正斜杠 / 定义路径
import os
import zipfile
# ✅ 正确:使用正斜杠,与 ZIP 内部路径格式完全一致
mods_folder = r"C:Users***AppDataRoamingPrismLauncherinstances.21.minecraftmods"
target_path = "data/c/tags/item/" # 注意:全部为 '/',无反斜杠
target_file = "coal.json"
found_jar_files = []
for root, dirs, files in os.walk(mods_folder):
for file in files:
if file.endswith(".jar"):
jar_path = os.path.join(root, file)
try:
with zipfile.ZipFile(jar_path, 'r') as jar:
# 构建标准 ZIP 路径(注意末尾不加 '/' 也可,但推荐保持一致性)
full_target = f"{target_path}{target_file}"
if full_target in jar.namelist(): # ✅ 更高效:直接成员检查,而非遍历
print(f"Found '{target_file}' in: {jar_path}")
found_jar_files.append(jar_path)
except zipfile.BadZipFile:
print(f"Warning: '{jar_path}' is not a valid JAR/ZIP file.")
if found_jar_files:
print(f"
✅ Found '{target_file}' in these JAR files:")
for path in found_jar_files:
print(f" • {path}")
else:
print(f"❌ No '{target_file}' found in any JAR under '{mods_folder}'.")优化说明与注意事项:
- ✅ 路径分隔符必须为
/:zipfile.ZipFile.namelist()返回的所有条目均使用正斜杠,这是 ZIP 规范要求,与操作系统无关; - ✅ 优先使用
in jar.namelist():比遍历namelist()更简洁高效,避免冗余循环; - ⚠️ 路径大小写敏感:Minecraft 资源路径严格区分大小写(如
cvsC),确保target_path与实际资源路径完全一致; - ⚠️ 嵌套 ZIP 或非标准 JAR:部分模组可能打包为
.jar但实际是 ZIP 套壳(如含META-INF/但结构异常),BadZipFile异常已妥善捕获; - ? 调试建议:临时添加
print(f"Sample entries from {file}: {jar.namelist()[:5]}")可快速验证路径格式,确认是否存在类似data/c/tags/item/coal.json的条目。
该方案无需额外依赖,兼容 Python 3.12+,可直接用于排查模组冲突(如重复注册 c:coal 标签),大幅提升大型模组环境下的问题定位效率。


















