为何我的Python函数添加文件名而非文件内容?代码问题排查
问题分析与修复方案
嘿,我一眼就看出问题出在哪了——你现在拿到的只是文件路径字符串,根本没真正打开文件读取内容!askopenfilename()返回的是你选中文件的路径(比如C:/test.py),你直接遍历这个字符串的话,是在逐个拆解路径里的每个字符,而不是文件里的代码行。咱们一步步把问题拆解开,再修复代码:
主要错误点
- 未读取文件内容:
getFileName()返回的是文件路径,你需要用open()函数打开这个路径对应的文件,才能读取里面的代码行。 - 变量拼写错误:
fCount()里你写了fAmout.append(line),但定义的列表是fList,这会直接抛出NameError。 - 条件判断逻辑错误:
if line[0] != "#" or line != "":应该用and,而且空行可能包含空格/制表符,直接判断line != ""不准,得用line.strip() != "";另外如果行是空的,line[0]会触发索引错误,得先判断非空再检查注释。 - 重复调用文件选择框:
scLines()、fCount()、main()里都调用了getFileName(),会让用户多次选择文件,应该只选一次,把路径传给各个函数。
修复后的完整代码
from tkinter.filedialog import askopenfilename import time def getFileName(): sourceCode = askopenfilename() # 弹出对话框选择文件,返回文件路径 return sourceCode def scLines(file_path): scList = [] # 用with语句打开文件,自动处理关闭,避免资源泄漏 with open(file_path, 'r', encoding='utf-8') as f: for line in f: # 先去除首尾空白字符,判断非空,再检查不是注释行 stripped_line = line.strip() if stripped_line != "" and not stripped_line.startswith("#"): scList.append(line.rstrip('\n')) # 去掉换行符,让输出更整洁 return scList def countscLine(file_path): lineCount = len(scLines(file_path)) return lineCount def fCount(file_path): fList = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: stripped_line = line.strip() # 判断是否是函数定义行 if stripped_line.startswith('def '): fList.append(stripped_line) return len(fList), fList # 返回函数数量和函数列表 def main(): print("Select the file to be analyzed") time.sleep(2) # 缩短等待时间,5秒有点久啦 file_path = getFileName() if not file_path: # 处理用户取消选择的情况 print("No file selected!") return print("The file is", file_path) code_lines = countscLine(file_path) func_count, func_list = fCount(file_path) print(f"The source code has {code_lines} lines of code, and {func_count} functions.") print("Non-comment, non-empty code lines:") for line in scLines(file_path): print(line) if __name__ == "__main__": main()
关键修复说明
- 文件读取逻辑:用
with open(...) as f打开文件,这样文件会在代码块结束后自动关闭,安全又省心;直接遍历文件对象f就能逐行读取内容。 - 条件判断优化:先对行做
strip()处理,去掉首尾空白,再判断非空和不是注释行,避免空行索引报错,也能过滤掉只有空格的行。 - 避免重复选文件:
main()里只调用一次getFileName(),把路径传给其他函数,用户只需要选一次文件。 - 函数返回值优化:
fCount()同时返回函数数量和函数列表,让输出更清晰;还处理了用户取消选择文件的情况,避免报错。
现在运行代码,选一个Python文件,就能正确统计有效代码行数和函数数量啦!
内容的提问来源于stack exchange,提问作者Rashad Jackson
相关产品推荐
相关产品推荐

