Python天文数据查询程序输入1触发无效输入问题修复咨询
CSV天文数据查询程序输入1报错,无法进入按Object查询流程
问题描述
我开发了一个基于CSV的天文数据查询程序,包含按Object名称查询(searchByObject)和按Filter筛选(searchByFilter)两个功能。程序运行时,输入选择项1后,系统错误返回"Sorry, invalid input",无法进入按Object查询流程。期望输入1后,能正常提示输入对象名称并返回对应数据。
数据集
| Object | HJD 24... | Filter | Magnitude |
|---|---|---|---|
| SU_Hor | 55896.30476 | B | 14.877 |
| SU_Hor | 55896.27438 | Ic | 13.885 |
| SU_Hor | 55896.27349 | B | 14.809 |
| SU_Hor | 55896.27397 | V | 14.434 |
| SU_Hor | 55896.40882 | Ic | 14.033 |
| SU_Hor | 55896.40829 | V | 14.540 |
| SU_Hor | 55896.40770 | B | 14.941 |
| SU_Hor | 55896.34973 | Ic | 13.958 |
| SU_Hor | 55896.34943 | V | 14.494 |
| SU_Hor | 55896.34906 | B | 14.861 |
| SU_Hor | 55896.30542 | Ic | 13.912 |
| SU_Hor | 55896.30512 | v | 14.440 |
| SU_Hor | 55897.38547 | V | 14.536 |
| SU_Hor | 55897.28281 | B | 14.882 |
| SU_Hor | 55897.28317 | V | 14.428 |
| SU_Hor | 55897.28347 | Ic | 13.927 |
| RZ_Lyr | 27359.3030 | V | 10.630 |
| RZ_Lyr | 27684.4510 | V | 10.610 |
| RZ_Lyr | 27685.4780 | V | 10.580 |
| RZ_Lyr | 27701.3150 | V | 10.700 |
| RZ Lyr | 27934.4560 | V | 10.660 |
| RZ Lyr | 27955.4100 | V | 10.570 |
| rzlyr | 30604.2000 | V | 11.030 |
| RZ_Lyr | 55314.5695 | B | 12.047 |
| RZ_Lyr | 55314.5724 | B | 12.036 |
| RZ_Lyr | 55314.5900 | B | 12.042 |
| RZ_Lyr | 55314.6105 | B | 12.045 |
| RZ_Lyr | 55314.6163 | B | 12.027 |
| RZ_Lyr | 55342.3509 | B | 12.057 |
| RZLyr | 55342.3557 | B | 12.058 |
| RZ_Lyr | 55342.3606 | B | 12.052 |
| RZ_Lyr | 55342.3654 | B | 12.058 |
现有代码
import csv def searchByObject(): object = input('Enter Object name\n') csv_file = csv.reader(open("D:/Астрономия Курс 2/PycharmProjects/Python_2ndLab.csv", "r")) for column in csv_file: if object == column[0]: print(column) def searchByFilter(): filter = str(input('Enter filter to show data')) csv_file = csv.reader(open("D:/Астрономия Курс 2/PycharmProjects/Python_2ndLab.csv", "r")) for column in csv_file: if filter in column[2]: print(column) print('Enter 1 to search by object name') print('Enter 2 to search by filter') src = (input('Enter here: ')) if src == 1: searchByObject() elif src == 2: searchByFilter() else: print('Sorry, invalid input')
当前输出
- Name: Filter, dtype: object
- Enter 1 to search by object name
- Enter 2 to search by filter
- Enter here: 1
Sorry, invalid input
预期输出
- Name: Filter, dtype: object
- Enter 1 to search by object name
- Enter 2 to search by filter
- Enter here: 1
- Enter the object name to show data: SU_Hor
(返回SU_Hor的所有数据)
解决方案
核心问题
input()函数返回的是字符串类型,而代码中把输入的src和整数1、2做比较,两者类型不匹配,条件永远不成立,因此直接进入else分支输出错误提示。
修改后的代码
import csv def searchByObject(): obj_name = input('Enter Object name\n') # 使用with语句自动关闭文件,避免资源泄漏 with open("D:/Астрономия Курс 2/PycharmProjects/Python_2ndLab.csv", "r", encoding="utf-8") as f: csv_file = csv.reader(f) # 跳过表头 next(csv_file) found = False for row in csv_file: # 忽略大小写匹配,兼容数据集中不同格式的Object名称 if obj_name.strip().lower() == row[0].strip().lower(): print(row) found = True if not found: print(f"No data found for object: {obj_name}") def searchByFilter(): filter_name = input('Enter filter to show data\n') with open("D:/Астрономия Курс 2/PycharmProjects/Python_2ndLab.csv", "r", encoding="utf-8") as f: csv_file = csv.reader(f) next(csv_file) found = False for row in csv_file: if filter_name.strip().lower() == row[2].strip().lower(): print(row) found = True if not found: print(f"No data found for filter: {filter_name}") print('Enter 1 to search by object name') print('Enter 2 to search by filter') src = input('Enter here: ').strip() # 改为和字符串"1"、"2"比较,或者将输入转为整数 if src == "1": searchByObject() elif src == "2": searchByFilter() else: print('Sorry, invalid input')
额外优化点
- 使用
with语句管理文件打开,确保文件自动关闭,避免资源泄漏 - 跳过CSV表头,避免表头被误匹配
- 添加忽略大小写和去除空格的匹配逻辑,兼容数据集中
RZ_Lyr、RZ Lyr、rzlyr这类不同格式的名称 - 添加未找到数据时的提示信息,提升用户体验
- 变量名修改为更符合Python规范的名称(如
obj_name代替object,避免和内置关键字冲突)
内容的提问来源于stack exchange,提问作者Fika
相关产品推荐
相关产品推荐

