You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python天文数据查询程序输入1触发无效输入问题修复咨询

CSV天文数据查询程序输入1报错,无法进入按Object查询流程

问题描述

我开发了一个基于CSV的天文数据查询程序,包含按Object名称查询(searchByObject)和按Filter筛选(searchByFilter)两个功能。程序运行时,输入选择项1后,系统错误返回"Sorry, invalid input",无法进入按Object查询流程。期望输入1后,能正常提示输入对象名称并返回对应数据。

数据集

ObjectHJD 24...FilterMagnitude
SU_Hor55896.30476B14.877
SU_Hor55896.27438Ic13.885
SU_Hor55896.27349B14.809
SU_Hor55896.27397V14.434
SU_Hor55896.40882Ic14.033
SU_Hor55896.40829V14.540
SU_Hor55896.40770B14.941
SU_Hor55896.34973Ic13.958
SU_Hor55896.34943V14.494
SU_Hor55896.34906B14.861
SU_Hor55896.30542Ic13.912
SU_Hor55896.30512v14.440
SU_Hor55897.38547V14.536
SU_Hor55897.28281B14.882
SU_Hor55897.28317V14.428
SU_Hor55897.28347Ic13.927
RZ_Lyr27359.3030V10.630
RZ_Lyr27684.4510V10.610
RZ_Lyr27685.4780V10.580
RZ_Lyr27701.3150V10.700
RZ Lyr27934.4560V10.660
RZ Lyr27955.4100V10.570
rzlyr30604.2000V11.030
RZ_Lyr55314.5695B12.047
RZ_Lyr55314.5724B12.036
RZ_Lyr55314.5900B12.042
RZ_Lyr55314.6105B12.045
RZ_Lyr55314.6163B12.027
RZ_Lyr55342.3509B12.057
RZLyr55342.3557B12.058
RZ_Lyr55342.3606B12.052
RZ_Lyr55342.3654B12.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')

额外优化点

  1. 使用with语句管理文件打开,确保文件自动关闭,避免资源泄漏
  2. 跳过CSV表头,避免表头被误匹配
  3. 添加忽略大小写和去除空格的匹配逻辑,兼容数据集中RZ_Lyr、RZ Lyr、rzlyr这类不同格式的名称
  4. 添加未找到数据时的提示信息,提升用户体验
  5. 变量名修改为更符合Python规范的名称(如obj_name代替object,避免和内置关键字冲突)

内容的提问来源于stack exchange,提问作者Fika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:25:20