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

如何在Python 3中解析Linux系统下的XKB列表文件?

问题描述

我需要解析Linux系统中路径为/usr/share/X11/xkb/rules/base.lst的XKB文件,将结果拆分到三个列表中:layouts = []、variants = []、options = []。我找到了一个C++实现示例,但没法转换成Python实现。自己写了一段代码,执行后所有列表都是空的,求帮忙解决。

我尝试的代码如下:

#!/usr/bin/env python3

layouts = []
options = []
variants = []

with open('/usr/share/X11/xkb/rules/base.lst') as f:
    content = f.readlines()

for line in content:
    line = line.strip()

    if line.startswith('! layout'):
        layouts.append(line[1:])
    elif line.startswith('! option'):
        options.append(line[1:])
    elif line.startswith('! variant'):
        variants.append(line)

print('Layouts:')
print(layouts)
print()
print('Options:')
print(options)
print()
print('Variants:')
print(variants)
问题分析与解决

你的代码逻辑有误:base.lst里的! layout、! variant、! option是区块标题行,真正的条目是标题行之后的非空、非标题行内容,不是把标题行本身加入列表。需要切换收集状态,进入对应区块后开始收集后续条目,直到遇到新的区块标题或文件结束。

以下是修正后的Python实现:

#!/usr/bin/env python3

layouts = []
options = []
variants = []
current_group = None

with open('/usr/share/X11/xkb/rules/base.lst') as f:
    for line in f:
        line = line.strip()
        # 跳过空行和注释行
        if not line or line.startswith('//'):
            continue
        # 判断区块标题,切换当前收集组
        if line.startswith('! layout'):
            current_group = 'layout'
            continue
        elif line.startswith('! variant'):
            current_group = 'variant'
            continue
        elif line.startswith('! option'):
            current_group = 'option'
            continue
        # 根据当前组收集条目
        if current_group == 'layout':
            layouts.append(line)
        elif current_group == 'variant':
            variants.append(line)
        elif current_group == 'option':
            options.append(line)

# 示例打印前5条结果,避免输出过多内容
print('Layouts:')
for layout in layouts[:5]:
    print(f'- {layout}')
print()
print('Variants:')
for variant in variants[:5]:
    print(f'- {variant}')
print()
print('Options:')
for option in options[:5]:
    print(f'- {option}')

代码说明

  • 用current_group变量跟踪当前处于哪个区块
  • 跳过空行和以//开头的注释行
  • 遇到区块标题时切换收集状态,不收集标题行本身
  • 进入对应区块后,将后续有效行加入对应列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:15:17