
本文介绍如何修正 Python 脚本,使其能正确在大量 Minecraft 模组(.jar 文件)中搜索特定资源文件(如 coal.json),关键在于统一路径分隔符——ZIP 内部路径始终使用正斜杠 /,而 Windows 环境下易误用反斜杠 导致匹配失败。
本文介绍如何修正 python 脚本,使其能正确在大量 minecraft 模组(.jar 文件)中搜索特定资源文件(如 `coal.json`),关键在于统一路径分隔符——zip 内部路径始终使用正斜杠 `/`,而 windows 环境下易误用反斜杠 `` 导致匹配失败。
Java 归档(JAR)文件本质上是 ZIP 格式,其内部条目路径(由 zipfile.ZipFile.namelist() 返回)严格使用正斜杠 / 作为目录分隔符,无论宿主操作系统是 Windows、macOS 还是 Linux。而原脚本中定义的 target_path = "data\c\tags\item\" 使用了 Windows 风格的双反斜杠转义序列,生成的完整路径字符串为 "data\c\tags\item\coal.json"(实际存储为 datac agsitemcoal.json),与 ZIP 中真实的 "data/c/tags/item/coal.json" 完全不匹配,因此 entry == ... 永远为 False,导致“查无结果”。
✅ 正确做法是:所有目标路径均使用正斜杠 /,并确保拼接逻辑清晰、无冗余分隔符。以下是优化后的完整脚本:
import os
import zipfile
# ✅ 修正:统一使用正斜杠 '/',避免平台差异
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.lower().endswith(".jar"): # 更健壮:忽略大小写(如 .JAR)
jar_path = os.path.join(root, file)
try:
with zipfile.ZipFile(jar_path, 'r') as jar:
# 构造期望的完整路径(注意:ZIP 中无驱动器盘符,无反斜杠)
expected_entry = target_path + target_file
if expected_entry in jar.namelist():
print(f"✅ Found '{target_file}' in: {jar_path}")
found_jar_files.append(jar_path)
except zipfile.BadZipFile:
print(f"⚠️ Skipped invalid ZIP/JAR: {jar_path}")
except Exception as e:
print(f"⚠️ Error reading {jar_path}: {e}")
# 输出汇总
print("
" + "="*60)
if found_jar_files:
print(f"? Found '{target_file}' in {len(found_jar_files)} JAR(s):")
for i, path in enumerate(found_jar_files, 1):
print(f"{i}. {path}")
else:
print(f"❌ No '{target_file}' found in any JAR under '{mods_folder}'")
? 关键改进说明:
-
路径标准化:
target_path明确使用/,expected_entry直接拼接,语义清晰; -
健壮性增强:
file.lower().endswith(".jar")兼容.JAR或.Jar; -
错误处理完善:捕获
BadZipFile外,也兜底通用异常,避免单个损坏 JAR 终止整个扫描; - 输出更友好:添加符号标识(✅/⚠️/❌)和分隔线,便于快速定位结果。
? 额外建议(针对 Minecraft 模组调试):
- 若需搜索 任意位置 的
coal.json(不限于data/c/tags/item/),可改用any(entry.endswith(target_file) for entry in jar.namelist()); - 对超大模组库(如 >500 个 JAR),可考虑多进程加速(
concurrent.futures.ProcessPoolExecutor); - 推荐配合
7-Zip或JD-GUI手动验证可疑 JAR —— 双重确认可避免误判。
该方案直击 ZIP 路径规范本质,无需额外依赖,开箱即用,是定位 Minecraft 资源冲突(如标签覆盖、配方重复)的高效实践。











