gpt4 book ai didi

python - 使用 ckanapi 和 Python 使用资源创建 CKAN 包/数据集

转载 作者:太空宇宙 更新时间:2023-11-03 12:01:16 25 4
gpt4 key购买 nike

CKAN 提供 ckanapi访问包 the CKAN API通过 Python 或命令行。

我可以使用它来下载元数据、创建资源等。但我无法在单个 API 调用中创建包并将资源上传到它。 (包也称为数据集。)

在内部,ckanapi scans all keys moving any file-like parameters into a separate dict ,它passes to the requests.session.post(files=..) parameter .

这是我能得到的最接近的,但 CKAN 返回 HTTP 500 错误(从 this guide to requests 复制):

with ckanapi.RemoteCKAN('http://myckan.example.com', apikey='real-key', user_agent=ua, username='joe', password='pwd') as ckan:
ckan.action.package_create(name='joe_data',
resources=('report.xls',
open('/path/to/file.xlsx', 'rb'),
'application/vnd.ms-excel',
{'Expires': '0'}))

我也试过resources=open('path/file'), files=open('file'),更短或更长的元组,但是得到同样的 500 错误。

requests 文档说:

:param files: (optional) Dictionary of ``'filename': file-like-objects``
for multipart encoding upload.

我无法传递 ckanapi resources={'filename': open('file')} 因为 ckanapi 没有检测到文件,尝试将其作为普通参数传递给 requests,但失败了(“BufferedReader 不是 JSON 可序列化的”,因为它试图使文件成为 POST 参数)。如果我尝试传递文件列表,我也会得到同样的结果。但是the API is able to创建一个包并在一次调用中添加大量资源。

那么如何通过单个 ckanapi 调用创建一个包和多个资源?

最佳答案

我对此感到好奇,并认为我应该将一些东西放在一起进行测试。不幸的是我没有玩过你提到的 CLI。但我希望这能帮助您和其他遇到这个问题的人。

我不是很肯定,但我猜你的资源字典格式不正确。资源需要是字典列表。

这是一个用于执行单个 api 调用插入的 ruby​​ 脚本(目前我的首选语言):

# Ruby script to create a package and resource in one api call. 
# You can run this in https://repl.it/languages/ruby
# Don't forget to update URLs and API key.
require 'csv'
require 'json'
require 'net/http'

hash_to_json = {
"title" => 'test1',
"name" => 'test1',
"owner_org" => 'bbb9682e-b58c-4826-bf4b-b161581056be',
"resources" => [
{
"url" => 'http://www.resource_domain.com/doc.kml'
}
]
}.to_json

uri = URI('http://ckan_app_domain.com:5000/api/3/action/package_create')

Net::HTTP.start(uri.host, uri.port) do |http|
request = Net::HTTP::Post.new uri

request['Authorization'] = 'user-api-key'
request.body = hash_to_json

response = http.request request
puts response.body
end

这是一个简单的 python 脚本来做同样的事情(感谢 CKAN 文档为我修改了这个模板)

#!/usr/bin/env python
import urllib2
import urllib
import json
import pprint

# Put the details of the dataset we're going to create into a dict.
dataset_dict = {
'name': 'my_dataset_name',
'notes': 'A long description of my dataset',
'owner_org': 'bbb9682e-b58c-4826-bf4b-b161581056be',
'resources': [
{
'url': 'example.com'
}
]
}

# Use the json module to dump the dictionary to a string for posting.
data_string = urllib.quote(json.dumps(dataset_dict))

# We'll use the package_create function to create a new dataset.
request = urllib2.Request(
'http://ckan_app_domain.com:5000/api/3/action/package_create')

# Creating a dataset requires an authorization header.
# Replace *** with your API key, from your user account on the CKAN site
# that you're creating the dataset on.
request.add_header('Authorization', 'user-api-key')

# Make the HTTP request.
response = urllib2.urlopen(request, data_string)
assert response.code == 200

# Use the json module to load CKAN's response into a dictionary.
response_dict = json.loads(response.read())
assert response_dict['success'] is True

# package_create returns the created package as its result.
created_package = response_dict['result']
pprint.pprint(created_package)

关于python - 使用 ckanapi 和 Python 使用资源创建 CKAN 包/数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48054042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com