Python解析.desktop文件如何获取首个Name=字段而非最后匹配项
解决方案
问题根源
你的代码会遍历所有行,每次匹配到Name=都会更新结果值,最终自然返回最后一处匹配的内容。同时你不需要创建临时文件中转内容,self.name本身就是.desktop文件的完整字符串,可以直接拆分遍历。
适配修改
最小改动版(兼容你现有逻辑)
匹配到第一个Name=后直接跳出循环,停止后续查找:
o2 = self.name #create a temp file so that i can... tmp = tempfile.NamedTemporaryFile() with open(tmp.name, 'w') as f: f.write(o2) target_name = "" #use readline for a grep like function with open(tmp.name) as f: for line in f.readlines(): if 'Name=' in line: target_name = line.strip().split("=", 1)[1] # 匹配到第一个结果直接终止遍历 break print(target_name)
优化版(移除冗余临时文件操作,性能更高)
直接对self.name字符串做行拆分遍历,减少不必要的IO操作:
o2 = self.name target_name = "" for line in o2.splitlines(): # 用startswith匹配更严谨,避免行中间出现Name=的异常情况 if line.startswith("Name="): target_name = line.split("=", 1)[1] break print(target_name)
更严谨的规范解析版
标准.desktop文件的主应用名称固定归属于[Desktop Entry]分组,以下逻辑可以完全避免其他分组的同名键干扰,适用所有符合规范的.desktop文件:
o2 = self.name target_name = "" in_main_group = False for line in o2.splitlines(): line = line.strip() # 进入主分组后才开始查找Name if line == "[Desktop Entry]": in_main_group = True continue # 遇到下一个分组直接终止查找 if in_main_group and line.startswith("["): break if in_main_group and line.startswith("Name="): target_name = line.split("=", 1)[1] break print(target_name)
内容的提问来源于stack exchange,提问作者Taylor Johnson
相关产品推荐
相关产品推荐

