Python指定编号读取CSV异常:选中文件后显示后续所有文件内容
问题:通过编号选择CSV文件时,会显示选中文件及后续所有文件内容
我写了个Python程序,用来展示目录下的CSV文件,用户输入文件编号就能查看对应内容。现在文件列表能正常显示,但输入编号后,会把选中的CSV内容和它之后的所有CSV内容都显示出来。我调过变量p的值没用,直接通过文件名打开是正常的,但有些文件名太长,还是想用编号选文件。
测试情况:输入1时,会显示Herman.csv和Jemma.csv的内容;输入2时,只显示Jemma.csv的内容。
原程序代码:
def seeProject(): y = 1 p = 0 for x in os.listdir(): if x.endswith(".csv"): print(str(y)+". " + x) y = y+1 f = input("Which would you like to open?\n") for x in os.listdir(): if x.endswith(".csv") and p == int(f): j = open(x,"r") for w in j: print(w) else: p += 1 continue
问题原因
你的第二个循环逻辑有漏洞:
- 只有当文件是CSV且
p等于输入编号时,才会打开文件;否则p加1并跳过 - 但当
p等于编号并打开文件后,后续循环里p的值不会再递增,导致后面所有CSV文件都会满足p == int(f)的条件,所以会被逐个打开显示
修复方案
正确的思路是先把所有CSV文件收集到一个列表里,通过编号直接索引列表获取目标文件,逻辑更清晰且不易出错:
import os def seeProject(): # 一次性收集所有CSV文件到列表 csv_files = [file for file in os.listdir() if file.endswith(".csv")] # 展示带编号的文件列表 for idx, file in enumerate(csv_files, start=1): print(f"{idx}. {file}") # 处理用户输入并打开文件 try: selected_num = int(input("Which would you like to open?\n")) # 验证编号有效性 if 1 <= selected_num <= len(csv_files): target_file = csv_files[selected_num - 1] # 列表索引从0开始,编号从1开始 with open(target_file, "r") as f: for line in f: print(line, end="") # 避免重复换行(文件每行自带换行符) else: print("无效编号,请输入列表中的数字") except ValueError: print("请输入有效的整数") seeProject()
修复亮点
- 仅遍历一次目录,比原代码效率更高
- 用
enumerate自动生成编号,无需手动维护计数变量 - 增加输入验证,处理非整数输入和超出范围的编号
- 使用
with语句管理文件,自动关闭文件,避免资源泄漏
内容的提问来源于stack exchange,提问作者Alexis Bensky
相关产品推荐
相关产品推荐

