SAV 转 JSON 怎么操作?palworld-save-tools 完整指南
【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools
palworld-save-tools 能把 Palworld 的 .sav 二进制存档转成易读的 JSON(易读的数据格式),改完再原样转回 .sav。读完本文,你会装好环境、跑通第一次转换,并掌握部分解析、无损校验与批量备份等常用操作。
环境准备:装好 Python 和 palworld-save-tools
要求只有一条:Python 3.9 或更高版本。该工具不依赖任何第三方库,装完即用。
方式一,从 PyPI 安装并验证:
pip install palworld-save-tools palworld-save-tools --help✅ 看到 "Converts Palworld save files to and from JSON" 的帮助输出即成功。
方式二,直接克隆源码使用(项目零依赖,无需再装):
git clone https://gitcode.com/gh_mirrors/pa/palworld-save-tools cd palworld-save-tools✅ 目录里出现 palworld_save_tools/ 和 tests/ 即成功。源码方式后续统一用python -m palworld_save_tools.commands.convert调用。
第一次跑通:一个存档文件走完整流程
仓库的 tests/testdata/ 目录里放了多个真实样例存档,适合先拿来做实验。按下面 5 步走一遍,你就掌握了核心流程。
第 1 步,确认样例文件存在:
ls tests/testdata/Level.sav✅ 输出 tests/testdata/Level.sav 即成功。
第 2 步,SAV 转 JSON,输出文件名默认在原文件名后追加 .json:
python -m palworld_save_tools.commands.convert tests/testdata/Level.sav✅ 看到 "Writing JSON to tests/testdata/Level.sav.json",且该文件已生成。
第 3 步,用 VS Code 等现代编辑器打开 Level.sav.json,搜索 "CharacterSaveParameterMap",确认能看到角色数据结构。JSON 可能很大,别用记事本。
第 4 步,JSON 转回 SAV,用 --output 指定新文件名,避免覆盖原档:
python -m palworld_save_tools.commands.convert tests/testdata/Level.sav.json --output Level-rt.sav✅ 看到 "Writing SAV file to Level-rt.sav" 即成功。
第 5 步,对比 Level-rt.sav 与原始 Level.sav 的解压后内容应完全一致,具体校验命令见下文场景二。
核心场景实战
把 Level.sav 转成 JSON 并只解析你要的数据
🎯 适用场景:只想看角色与公会信息,不想等整个大存档解析完 | ⏱️ 1 分钟,难度低
⚠️ 注意:Level.sav 全量转出的 JSON 会非常大,吃内存也吃编辑器,能少解析就少解析。
指定 --custom-properties 只解码指定路径的数据,其余部分跳过深度解析:
python -m palworld_save_tools.commands.convert Level.sav \ --output Level.json \ --custom-properties .worldSaveData.GroupSaveDataMap,.worldSaveData.CharacterSaveParameterMap.Value.RawData✅ 看到 "Writing JSON to Level.json" 即成功,Level.json 里只有公会与角色相关数据。
原理一句话:--custom-properties 按路径选择要启用的解码函数,路径清单定义在 paltypes.py 的 PALWORLD_CUSTOM_PROPERTIES 中。
💡 提示:传 --custom-properties all 表示全量解析(这是默认行为);只关心个别数据时,按需传子集能明显缩短转换时间。
改完 JSON 转回 SAV 并验证无损
🎯 适用场景:你修改了存档内容,写回游戏前想确认没有改坏 | ⏱️ 3 分钟
⚠️ 注意:写回游戏目录前务必备份原始 .sav,覆盖操作不可逆。
第 1 步,编辑 Level.json 中你关心的字段,保持原有数据类型不变。
第 2 步,转回 SAV:
python -m palworld_save_tools.commands.convert Level.json --output Level-new.sav✅ 看到 "Writing SAV file to Level-new.sav" 即成功。
第 3 步,用项目自带的往返校验脚本确认转换链路无损:
python -m palworld_save_tools.commands.resave_test Level.sav✅ 看到 "Files are the same!" 即成功,脚本会生成 .resave.json 和 .resave.sav 两个临时文件。
原理一句话:resave_test 执行 SAV→JSON→SAV 全流程,再逐字节比对两份存档解压后的内容,一致即无损。
💡 提示:每次游戏更新或大改存档前先跑一遍这个校验,出问题能立刻分清是工具还是你的修改导致的。
批量备份专用服务器存档
🎯 适用场景:专用服务器管理员定期备份多名玩家的存档 | ⏱️ 2 分钟
⚠️ 注意:跑批量脚本前,先把整个 SaveGames 目录复制一份,双保险。
mkdir -p backup/$(date +%Y%m%d) for f in /path/to/Pal/Saved/SaveGames/*/Level.sav; do id=$(basename $(dirname "$f")) python -m palworld_save_tools.commands.convert "$f" \ --output "backup/$(date +%Y%m%d)/${id}.sav.json" --minify-json --force done✅ 循环结束无报错,且 backup 当天目录里出现若干 .sav.json 文件即成功。
💡 提示:--minify-json 去掉缩进和换行,减小体积、方便其他程序读取;--force 跳过覆盖确认提示,脚本才能无人值守跑完。
让 JSON 兼容严格解析器
🎯 适用场景:转出的 JSON 要交给第三方工具处理,NaN 值导致对方解析失败 | ⏱️ 1 分钟
部分浮点字段会存为 NaN,标准 JSON 规范不承认它,严格解析器会直接报错。加一个参数即可规避:
python -m palworld_save_tools.commands.convert Level.sav --convert-nan-to-null✅ 看到 "Writing JSON to Level.sav.json" 即成功,输出中的 NaN 已变为 null。
⚠️ 注意:Inf/-Inf 同样会被转成 null,属于不可逆的信息丢失,只在下游工具确实读不了 NaN 时才用。
横向对比:palworld-save-tools 与通用存档工具怎么选
| 对比维度 | palworld-save-tools | 通用 Unreal 存档工具 | 手动二进制编辑 |
|---|---|---|---|
| SAV 与 JSON 双向转换 | 支持 | 多为只读单向 | 不支持 |
| 基地、公会、角色等 Palworld 结构 | 逐字段解析 | 保留为原始字节 | 需自行逆向 |
| 往返一致性 | 逐字节比对校验 | 不涉及 | 难以保证 |
| 第三方依赖 | 无,纯标准库 | 各有依赖 | 取决于工具 |
| 上手成本 | 一条命令 | 中等 | 高 |
如果你要查看或修改 Palworld 存档内容,选 palworld-save-tools;只是想快速看一眼存档大致结构,通用 Unreal 工具也够用。
进阶玩法
两个方向:把转换能力接进自己的代码,以及把往返校验做成批处理。
方向一,直接调用转换函数,跳过命令行:
from palworld_save_tools.commands.convert import ( convert_sav_to_json, convert_json_to_sav, ) # 存档转 JSON,只解析角色数据 convert_sav_to_json( "Level.sav", "Level.json", custom_properties_keys=[".worldSaveData.CharacterSaveParameterMap.Value.RawData"], ) # 修改 JSON(省略),再转回 SAV convert_json_to_sav("Level.json", "Level-new.sav")✅ 运行后当前目录生成 Level.json 和 Level-new.sav 即成功。
方向二,批量校验多个存档的往返完整性,配合 cron 或 systemd 定时任务即可无人值守:
for f in /path/to/SaveGames/*/Level.sav; do python -m palworld_save_tools.commands.resave_test "$f" done✅ 每个存档都输出 "Files are the same!" 即全部通过;出现 "Files are different!" 时优先检查对应版本是否跟上了游戏更新。
问题自检
Q:Palworld 的存档文件在哪里?
Steam 版 Windows 在 %LOCALAPPDATA%\Pal\Saved\SaveGames\ \ \Level.sav;专用服务器在服务器端 Pal/Saved/SaveGames 目录下。没有存档可以先用仓库 tests/testdata/ 里的样例练手。Q:报 "not a compressed Palworld save" 或 "unknown save type" 怎么办?
先确认文件是完整的 .sav 而非残缺拷贝或改名的文件。若刚经历过游戏更新,先升级工具再重试:pip install --upgrade palworld-save-tools✅ 升级完成后重新执行转换。
Q:转回的 SAV 和原文件大小不一样,是不是坏了?
SAV 是 zlib 压缩格式(一种压缩算法),压缩后大小会波动,不能只看体积。用往返校验判断:python -m palworld_save_tools.commands.resave_test Level.sav✅ 输出 "Files are the same!" 说明内容无损。
Q:提示 "already exists, this will overwrite the file" 卡住了?
输出文件已存在,工具在等你手动确认。脚本或重跑场景加 --force 跳过提示,或用 --output 换个文件名:python -m palworld_save_tools.commands.convert Level.sav --output Level-copy.json --force✅ 看到 "Writing JSON to Level-copy.json" 即成功。
Q:怎么快速确认 JSON 里有没有我要的数据?
在 VS Code 里打开 Level.sav.json 后直接搜索:CharacterSaveParameterMap 是角色,BaseCampSaveData 是基地,GroupSaveDataMap 是公会。搜不到说明该路径未启用解析,回到"只解析你要的数据"一节检查 --custom-properties。Q:可解析的属性路径清单在哪里看?
看源码 palworld_save_tools/paltypes.py 中的 PALWORLD_CUSTOM_PROPERTIES 字典,键就是全部可选路径。懒得挑时传 all 全量解析:python -m palworld_save_tools.commands.convert Level.sav --custom-properties all✅ 看到 "Writing JSON to Level.sav.json" 即成功。
收尾:照着这四步走
- 基础:背熟 SAV 转 JSON、JSON 转 SAV 两条命令,能独立完成一次往返。
- 应用:用 --custom-properties 按需求裁剪解析范围,写回游戏前跑一遍 resave_test。
- 自动化:把批量备份与批量校验放进定时任务,服务器存档自动归档。
- 进阶:在自己的项目里直接 import 转换函数,把它当存档处理库用。
版本提醒:palworld-save-tools 处于快速迭代期,游戏更新后存档结构可能变化,建议 pip 安装时锁定具体版本,需要新功能时再按需升级。
【免费下载链接】palworld-save-toolsTools for converting Palworld .sav files to JSON and back项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考