使用astroquery匹配GALEX星表时CSV读写报ValueError如何解决
问题根因
- 你构造表头时使用的是最后一次循环返回的
catalogData的列名,若最后一次查询无匹配结果、catalogData为空,表头长度就会和实际匹配到的行数据长度不一致,触发列数不匹配的报错 - 代码中目前保留了测试用的
if iteration > 2: break逻辑,正式运行需要先删除,否则只会处理前2个星系
修复方案
推荐直接用astropy的Table结构存储匹配结果,不需要手动维护表头和列的对应关系,从根源避免列数不匹配问题,修改后代码如下:
from astroquery.mast import Catalogs import numpy as np from astropy.io import ascii from astropy.table import Table myfile='/Users/slaterjonesoden/Desktop/GALEX_analysis/RQE_sample_data.csv' sample = ascii.read(myfile, format='csv', delimiter=',', guess=True) # 初始化空Table存储结果 galexMatchCatalog = Table() iteration = 1 for each_galaxy in sample: print(f"处理第{iteration}个星系,RA={each_galaxy['RAgal']}, DEC={each_galaxy['DECgal']}") iteration += 1 # 可根据需求调整匹配半径,这里示例为3角秒,默认是1角秒 catalogData = Catalogs.query_object(f"{each_galaxy['RAgal']} {each_galaxy['DECgal']}", catalog="Galex", radius="3s") if len(catalogData) == 0: print("该星系无GALEX匹配结果,跳过") continue # 取匹配到的第一个结果 match_row = catalogData[0] # 追加SDSS的坐标字段 match_row['sdss_ra'] = each_galaxy['RAgal'] match_row['sdss_dec'] = each_galaxy['DECgal'] # 加入结果表 galexMatchCatalog.add_row(match_row) # 直接写入结果,无需手动指定表头 ascii.write(galexMatchCatalog, '/Users/slaterjonesoden/Desktop/GALEX_analysis_codes/172_RQEs_galex_mast_match.csv', format='csv', overwrite=True)
可选修改说明
如果要保留你原本的列表拼接写法,只需要调整表头的获取逻辑即可:在第一次拿到有效匹配结果时就保存表头,不要使用最后一次循环的查询结果构造表头。
内容的提问来源于stack exchange,提问作者Slater Oden
相关产品推荐
相关产品推荐

