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

为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:22:08