You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析War Thunder的.blk文本文件为可层级访问的字典结构?

解析《战争雷霆》BLK文件的Python实现

要实现通过类似areas.spawn_zone.type的方式访问BLK文件数据,可以自定义嵌套类结构或基于字典实现属性式访问,以下是无第三方依赖的手动实现方案:

核心思路

BLK文件是嵌套的块/键值对结构,我们用支持属性访问的嵌套字典映射该结构,将文件内容逐层解析为可直接通过.调用的对象。

代码实现

1. 定义支持属性访问的字典类

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.__dict__ = self

    def __getattr__(self, item):
        try:
            return self[item]
        except KeyError:
            raise AttributeError(f"'AttrDict' object has no attribute '{item}'")

2. BLK文件解析函数

import re

def parse_blk(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        # 过滤空行并去除首尾空白
        lines = [line.strip() for line in f if line.strip()]
    
    stack = [AttrDict()]
    for line in lines:
        # 匹配块开始(如areas{)
        block_match = re.match(r'(\w+)\{', line)
        if block_match:
            block_name = block_match.group(1)
            new_block = AttrDict()
            stack[-1][block_name] = new_block
            stack.append(new_block)
            continue
        
        # 匹配块结束(})
        if line == '}':
            stack.pop()
            continue
        
        # 匹配键值对(如type:t="Sphere")
        kv_match = re.match(r'(\w+):(\w+)=(.*)', line)
        if kv_match:
            key, type_tag, value = kv_match.groups()
            # 根据类型标签解析值
            if type_tag == 't':
                parsed_value = value.strip('"')
            elif type_tag == 'i':
                parsed_value = int(value)
            elif type_tag == 'm':
                # 解析矩阵格式:[[...] [...] ...]
                value_clean = value.replace('[', '').replace(']', '')
                parsed_value = [list(map(float, part.split(','))) for part in value_clean.split() if part]
            else:
                parsed_value = value.strip('"')
            stack[-1][key] = parsed_value
    
    return stack[0]

3. 使用示例

假设你的BLK文件名为map_data.blk,调用方式如下:

data = parse_blk('map_data.blk')
# 直接通过属性访问数据
print(data.areas.spawn_zone.type)       # 输出: Sphere
print(data.areas.spawn_zone.objLayer)   # 输出: 0
print(data.areas.spawn_zone.tm)         # 输出解析后的矩阵列表

扩展说明

  • 若BLK文件包含其他类型标签(如浮点数f),可在解析函数的键值对处理部分添加对应逻辑。
  • 空块(如props{})会被解析为空的AttrDict,不影响后续属性访问。

内容的提问来源于stack exchange,提问作者Remfy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:43:12