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

