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

Datahub读取JSON数据代码失效,报错非表格数据不支持read方法

解决Methods iter/read are not supported for non tabular data报错及数据写入SQL方案

问题原因

你遇到的报错是因为当前获取的package.resources[0]不再是**表格类型(tabular)**资源——Datahub上这个数据集的datapackage结构可能更新了,第一个资源变成了非表格格式(比如元数据、描述文件等),而read()/iter()方法仅支持tabular类型的资源。

解决方案步骤

1. 筛选表格类型资源并读取数据

修改读取数据的代码,先筛选出支持表格操作的资源,再读取:

from datapackage import Package

package = Package('http://datahub.io/core/population/datapackage.json')

# 方法1:筛选所有表格类型资源,取第一个
tabular_resources = [res for res in package.resources if res.tabular]
if not tabular_resources:
    raise ValueError("未找到表格类型的资源")
data_resource = tabular_resources[0]

# 方法2:按资源名称精准筛选(更可靠,避免资源顺序变化)
# data_resource = package.get_resource('population')

# 读取表格数据
data = data_resource.read()
print(data)

2. 优化SQL数据写入(批量插入更高效)

原来的循环单条插入效率较低,建议用executemany()批量插入,既简洁又提升性能:

# 假设你已经建立了数据库连接cursor和cnxn对象
insert_query = "insert into Population_Country (CountryName,CountryCode,Year,PopulationNumber) values (?,?,?,?)"

# 批量插入所有数据
cursor.executemany(insert_query, data)
cnxn.commit()

调试小技巧

如果不确定哪个资源是你需要的,可以先打印所有资源的信息,确认名称和类型:

for res in package.resources:
    print(f"资源名称: {res.name}, 是否为表格: {res.tabular}")

运行后你会看到类似输出,找到名称为population且tabular为True的资源即可。

内容的提问来源于stack exchange,提问作者Student of the Digital World

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:34:06