为numpy genfromtxt添加names参数后读取到空字符串的问题
解决numpy.genfromtxt添加names参数后返回空字符串的问题
我之前也碰到过一模一样的问题,这其实不是数据没读进来,而是genfromtxt使用names参数时的行为特性导致的——你看到的空字符串只是默认打印格式的错觉,数据其实已经被正确读取了。
先还原一下你的测试场景:
你的测试代码
import numpy as np data_no_headers = np.genfromtxt('SimpleDataWithHeaders.csv', delimiter=',', dtype='str', autostrip=True) print(data_no_headers) data_with_headers = np.genfromtxt('SimpleDataWithHeaders.csv', delimiter=',', dtype='str', autostrip=True, names=True) print(data_with_headers) data_with_headers = np.genfromtxt('SimpleDataWithHeaders.csv', delimiter=',', skip_header=1, dtype='str', autostrip=True, names="A,B") print(data_with_headers) mycols = ['a','b'] data_with_headers = np.genfromtxt('SimpleDataWithHeaders.csv', delimiter=',', skip_header=1, dtype='str', autostrip=True, names=mycols) print(data_with_headers)
你的输出
[['CODE' 'AIRPORT'] ['HOU' 'Houston'] ['ABQ' 'Alberquerque'] ['BWI' 'Baltimore']] [('', '') ('', '') ('', '')] [('', '') ('', '') ('', '')] [('', '') ('', '') ('', '')]
问题根源
当你添加names参数时,genfromtxt返回的不再是普通的二维字符串数组,而是结构化数组(structured array)。你看到的空字符串,是因为指定dtype='str'时,numpy无法正确映射结构化数组的字段类型,导致打印显示异常;但实际上数据已经存在,只是需要用结构化数组的方式访问。
解决方案
方案1:明确指定结构化数据类型
直接定义每个字段的名称和对应字符串类型,让genfromtxt正确解析并显示数据:
import numpy as np # 定义结构化dtype,每个字段对应合适长度的Unicode字符串 data = np.genfromtxt( 'SimpleDataWithHeaders.csv', delimiter=',', dtype=[('CODE', 'U10'), ('AIRPORT', 'U20')], autostrip=True, names=True ) print("完整结构化数组:") print(data) print("\n单独访问CODE列:") print(data['CODE']) print("\n访问第一行的AIRPORT字段:") print(data[0]['AIRPORT'])
输出结果:
完整结构化数组: [('HOU', 'Houston') ('ABQ', 'Alberquerque') ('BWI', 'Baltimore')] 单独访问CODE列: ['HOU' 'ABQ' 'BWI'] 访问第一行的AIRPORT字段: Houston
方案2:让numpy自动推断数据类型
设置dtype=None,numpy会自动识别每个字段的类型,生成合适的结构化数组,打印时也能正常显示:
data = np.genfromtxt( 'SimpleDataWithHeaders.csv', delimiter=',', dtype=None, autostrip=True, names=True, encoding='utf-8' # 避免编码警告 ) print(data)
输出结果:
[('HOU', 'Houston') ('ABQ', 'Alberquerque') ('BWI', 'Baltimore')]
方案3:分开读取表头和数据(保持普通二维数组)
如果你更习惯使用普通二维数组,可以手动拆分表头和数据的读取:
# 手动读取表头行 with open('SimpleDataWithHeaders.csv', 'r', encoding='utf-8') as f: headers = f.readline().strip().split(',') # 读取数据(跳过表头行) data = np.genfromtxt( 'SimpleDataWithHeaders.csv', delimiter=',', dtype='str', autostrip=True, skip_header=1 ) print("表头:", headers) print("数据:", data)
输出结果:
表头: ['CODE', 'AIRPORT'] 数据: [['HOU' 'Houston'] ['ABQ' 'Alberquerque'] ['BWI' 'Baltimore']]
内容的提问来源于stack exchange,提问作者HockeyGeekGirl
相关产品推荐
相关产品推荐

