如何验证输入年份有效性并提取对应预期寿命相关数据?
解决CSV年份验证与数据提取问题
原代码存在的问题
- 文件读取逻辑错误:
for lines in f仅在第一次循环时读取文件内容,后续循环因文件指针已到末尾,不会再读取数据 - 年份验证逻辑错误:
any( [year in user_year for year in cat[2]] )是遍历单个年份字符串的字符进行判断,完全不符合“验证年份是否存在”的需求 - 未提前存储数据,无法快速提取对应年份的信息
修正后的实现步骤
- 预加载数据:读取整个CSV文件,收集所有存在的年份,并将数据按年份分组存储
- 年份验证:获取用户输入后,先转为整数,检查是否在已收集的年份集合中
- 数据提取与展示:验证通过后,取出对应年份的所有国家、代码及预期寿命数据并输出
修正后的代码
import pathlib # 获取文件路径 cwd = pathlib.Path(__file__).parent.resolve() data_file = cwd / 'life-expectancy.csv' # 预加载数据:按年份存储所有对应条目 year_data = {} existing_years = set() with open(data_file, 'r') as f: # 跳过表头(如果CSV有表头的话,无表头可注释此行) next(f) for line in f: parts = line.strip().split(',') # 确保每行字段完整 if len(parts) != 4: continue country, code, year_str, age_str = parts # 转换数据类型,处理异常格式的行 try: year = int(year_str) age = float(age_str) except ValueError: continue # 按年份分组存储数据 if year not in year_data: year_data[year] = [] year_data[year].append({ 'country': country, 'code': code, 'life_expectancy': age }) existing_years.add(year) # 处理用户输入与数据查询 while True: user_input = input('Enter the year of interest: ') # 验证输入是否为有效整数 try: user_year = int(user_input) except ValueError: print('请输入有效的数字年份') continue # 验证年份是否存在于数据中 if user_year not in existing_years: print(f'请输入文件中存在的年份,可选范围: {min(existing_years)}-{max(existing_years)}') continue # 格式化输出对应年份的数据 print(f'\n年份 {user_year} 的预期寿命数据:') print(f'{"国家":<30} {"代码":<10} {"预期寿命"}') print('-' * 50) for entry in year_data[user_year]: print(f'{entry["country"]:<30} {entry["code"]:<10} {entry["life_expectancy"]:.2f}') print()
代码关键点说明
- 预加载数据:用字典
year_data按年份存储对应条目,集合existing_years记录所有存在的年份,保证验证和查询的效率 - 双重验证:先检查输入是否为有效整数,再验证年份是否存在,避免无效输入干扰程序运行
- 容错处理:跳过格式错误的行,防止因数据异常导致程序崩溃
- 格式化输出:对齐展示数据,提升可读性
内容的提问来源于stack exchange,提问作者Ethan N
相关产品推荐
相关产品推荐

