如何解析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
相关产品推荐
相关产品推荐

