NBT 解析器 Minecraft mca 文件不是 gzip 压缩文件错误

问题描述 投票:0回答:3

我尝试使用 NBT 1.4.1 模块(名为二进制标签读取器/写入器)从文件系统和 .mca 区域/anvil 文件中使用 Python 读取 Minecraft 世界,该模块应该读取 Minecraft 中使用的 NBT 格式。它对于 level.dat 等文件运行良好,但对于 r.0.0.mca 等区域文件会引发错误

编辑:我指的是 Minecraft 存储在 .minecraft/saves/"MyWorld"/ 文件夹中的自动生成的世界文件。例如 level.dat (有效),以及存储在 .minecraft/saves/"MyWorld"/region/ 文件夹中的 mca 文件,例如 r.0.0.mca 无效。我从我的世界之一上传了两个示例文件。

代码:

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')

有什么建议如何让它发挥作用吗?

python python-3.x gzip minecraft
3个回答
1
投票

r.0.0.mca 绝对没有被压缩。大约 80% 的字节为零。


1
投票

事实证明,NBT 库仅支持 .mcr 区域文件,大约 6 年前该文件已被 .mca 文件取代。但是,mcedit 是用 Python 编写的并支持这些文件。由于Minecraft保存格式的变化,内容的解释虽然需要调整,但文件可以成功读取。


0
投票

您可以使用此Python包来解析.mca文件:https://github.com/0xTiger/anvil-parser2

pip install anvil-parser2
import anvil

region = anvil.Region.from_file('r.0.0.mca')

# You can also provide the region file name instead of the object
chunk = anvil.Chunk.from_region(region, 0, 0)

block = chunk.get_block(0, 0, 0)

print(block) # <Block(minecraft:air)>
print(block.id) # air
print(block.properties) # {}

免责声明:我是这个包的维护者 - anvil-parser 的一个分支,不支持最新的 Minecraft 版本

© www.soinside.com 2019 - 2024. All rights reserved.