我尝试使用 NBT 1.4.1 模块(命名二进制标签读取器/写入器)从文件系统和 .mca 区域/anvil 文件中使用 Python 读取 Minecraft 世界,该模块应该读取 NBT 格式在《我的世界》中使用。它对于 level.dat 等文件工作正常,但对于 r.0.0.mca 等区域文件会抛出错误
编辑:我指的是 Minecraft 存储在 .minecraft/saves/ 中的自动生成的世界文件“我的世界”/文件夹。例如 level.dat (有效),以及存储在.minecraft/saves/"MyWorld"/region/文件夹中的mca文件,例如 r.0.0.mca which不工作。我从我的世界之一上传了两个示例文件。
代码:
from nbt import nbt
level_file = nbt.NBTFile("level.dat", "rb") # works
region_file = nbt.NBTFile("r.0.0.mca", "rb")
# 不起作用
错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.5/dist-packages/nbt/nbt.py", line 508, in __init__
self.parse_file()
File "/usr/local/lib/python3.5/dist-packages/nbt/nbt.py", line 532, in parse_file
type = TAG_Byte(buffer=self.file)
File "/usr/local/lib/python3.5/dist-packages/nbt/nbt.py", line 85, in __init__
self._parse_buffer(buffer)
File "/usr/local/lib/python3.5/dist-packages/nbt/nbt.py", line 90, in _parse_buffer
self.value = self.fmt.unpack(buffer.read(self.fmt.size))[0]
File "/usr/lib/python3.5/gzip.py", line 274, in read
return self._buffer.read(size)
File "/usr/lib/python3.5/_compression.py", line 68, in readinto
data = self.read(len(byte_view))
File "/usr/lib/python3.5/gzip.py", line 461, in read
if not self._read_gzip_header():
File "/usr/lib/python3.5/gzip.py", line 409, in _read_gzip_header
raise OSError('Not a gzipped file (%r)' % magic)
OSError: Not a gzipped file (b'\x00\x00')
有什么建议吗?
这个错误信息表明你正试图使用
nbt
库来解析一个
mca
文件,但
nbt
库是用来解析 NBT 格式的文件,而不是
mca
文件。尽管
mca
文件中包含了 NBT 格式的数据,但它们本身并非 NBT 文件,并且有着不同的结构。
要解析
mca
文件,你需要使用一个专门为此目的设计的库。这里有一个使用
pymclevel
库解析
mca
文件的例子:
from pymclevel import mclevel
# 加载 mca 文件
level = mclevel.fromFile("r.0.0.mca")
# 访问 chunk 数据
for chunk in level.allChunks:
print(f"Chunk ({chunk.chunkPosition[0]}, {chunk.chunkPosition[1]}):")
# 访问 NBT 数据
nbt_data = chunk.Data
# 使用 nbt 库解析 NBT 数据
# ...
解释:
-
导入
mclevel
: 从pymclevel
库中导入mclevel
模块。 -
加载
mca
文件: 使用mclevel.fromFile()
函数加载名为 "r.0.0.mca" 的mca
文件。 -
遍历 chunk:
使用
level.allChunks
迭代器遍历mca
文件中的所有 chunk。 -
访问 chunk 数据:
对于每个 chunk,可以使用
chunk.Data
属性访问其 NBT 数据。 -
解析 NBT 数据:
可以使用
nbt
库解析chunk.Data
中的 NBT 数据。
注意:
-
你需要安装
pymclevel
库。你可以使用pip install pymclevel
命令来安装它。 -
这只是一个简单的例子,
pymclevel
库提供了更多用于访问和操作mca
文件中数据的函数和属性。你可以参考该库的文档以了解更多信息。
希望这能帮到你!
标签:python,python-3.x,gzip,minecraft From: 47414426