求助:Python关键字与标识符统计程序的问题排查
问题排查与修正方案
咱们一步步梳理你代码里的问题,然后调整成符合需求的版本:
现存问题分析
- 缺少用户输入文件名的逻辑:你直接硬编码了
source.py,没有按照需求提示用户输入目标文件路径 - 未实现标识符统计:代码只处理了关键字的计数,完全没覆盖变量、类、方法名这类标识符的统计需求
- token筛选逻辑不严谨:
tokenize生成的token包含多种类型,你直接过滤关键字,但标识符对应的是NAME类型的token(关键字也属于NAME类型),需要先筛选出NAME类型的token再分类处理
修正后的完整代码
import tokenize import keyword import collections # 提示用户输入文件名 filename = input("请输入Python源码文件路径:") try: with open(filename, 'r', encoding='utf-8') as f: # 生成token迭代器,同时获取token类型 tokens = tokenize.generate_tokens(f.readline) keyword_counter = collections.Counter() identifier_counter = collections.Counter() for token_type, token_str, _, _, _ in tokens: # 只处理NAME类型的token(关键字、标识符都属于这类) if token_type == tokenize.NAME: if keyword.iskeyword(token_str): keyword_counter[token_str] += 1 else: identifier_counter[token_str] += 1 # 输出统计结果 print("=== 关键字出现次数 ===") for kw, count in keyword_counter.most_common(): print(f"{kw}: {count}") print("\n=== 标识符出现次数 ===") for ident, count in identifier_counter.most_common(): print(f"{ident}: {count}") except FileNotFoundError: print(f"错误:未找到文件 {filename}") except Exception as e: print(f"处理文件时发生错误:{str(e)}")
关键修改说明
- 添加用户输入交互:用
input()函数获取用户输入的文件路径,满足需求要求 - 区分关键字与标识符:先筛选
tokenize.NAME类型的token(这是Python中命名类token的统一类型),然后用keyword.iskeyword()判断,分别加入两个计数器 - 增加异常处理:处理文件不存在、编码错误等常见异常,提升程序健壮性
- 优化输出格式:把两个统计结果分模块展示,更易读
补充说明
Python的tokenize模块会自动过滤源码中的注释、字符串、数字等非命名类内容,所以我们只需要关注NAME类型即可,不用担心把注释里的单词误统计进去;collections.Counter的most_common()方法会按出现次数从高到低排序输出,方便查看结果。
内容的提问来源于stack exchange,提问作者Emre Alpogunc
相关产品推荐
相关产品推荐

