如何使用变量检索索引,通过用户输入获取对应编号的索引值?
问题排查与修复方案
你代码里的问题主要有以下几点:
- 文件读取逻辑错误:
with open()块执行结束后会自动关闭文件,你遍历文件统计行数时已经把文件指针挪到了末尾,后续直接把userData文件对象存入列表的操作没有任何意义,既读不到内容,文件也已经关闭。 - 列表结构错误:你构造的
userList实际结构是[[None], 已关闭的文件对象],根本没有存储文件的每行内容,不可能通过索引拿到对应行的文本。 - 输入处理逻辑错误:你直接把用户输入转成了int类型,要是用户直接按回车输入空值,转int的步骤会直接抛出异常,后续判断输入为空的分支永远不会触发。
- 索引匹配逻辑错误:没有把文件每行内容单独存入列表,自然没法和用户输入的行号对应上。
修复后代码
fileName = input("Enter the name of the file, e.g. 'numbers.txt': ") # 直接读取所有行,同时统计行数 with open(fileName, 'r') as userData: # readlines()会把文件每行内容作为元素存入列表,自动保留换行符 lines = userData.readlines() lineCount = len(lines) print(lineCount) # 构造索引从1开始的列表,第0位留空对应用户输入0的异常情况 userList = [None] + lines while True: # 先接收原始输入,不要直接转int input_raw = input("Enter the number of the line you wish to see, or press enter twice to exit: ") if input_raw == "": print("Enjoy your data. Goodbye!") break # 转成int之前先做校验,避免非数字输入报错 try: inputTarget = int(input_raw) except ValueError: print("请输入有效的数字!") continue if inputTarget == 0: print("Great, you broke it...*slow clap*") break # 额外加边界判断,避免输入的行号超过文件最大行数报错 elif inputTarget > lineCount or inputTarget < 0: print(f"输入的行号超出范围,文件共{lineCount}行") else: # strip()可选,用来去掉行尾的换行符,不需要可以删掉 print(userList[inputTarget].strip())
内容的提问来源于stack exchange,提问作者Kyle Campbell
相关产品推荐
相关产品推荐

