openrefine - 如何在 OpenRefine ReST-API 的“创建项目”Post Rquest 中传递选项 JSON?
问题描述
我目前正在尝试将 Excel 表(作为 .xls)上传到 Ontotexts GraphDB 的 OpenRefine(或 OntoRefine)模块。由于上传 xls 时遇到问题,我决定先将 xls 文件转换为 csv 文件,然后再上传。不幸的是,OpenRefine 不会每次都自动将文件识别为 CSV。因此,每一行中的所有数据都存储在单个列中。例如:
--------------------------------------------------
| Col1, Col2, Col3, Col4 |
--------------------------------------------------
| Row11, Row12, Row13, Row14 |
--------------------------------------------------
| Row21, Row22, Row23, Row24 |
--------------------------------------------------
代替:
--------------------------------------------------
| Col1 | Col2 | Col3 | Col4 |
--------------------------------------------------
| Row11 | Row12 | Row13 | Row14 |
--------------------------------------------------
| Row21 | Row22 | Row23 | Row24 |
--------------------------------------------------
使用发布请求
POST /command/core/create-project-from-upload
可以将 'format' 参数中的文件格式和带有 'options' 参数中分隔符的 json 添加到 POST 请求中。但是,这也不起作用,官方 OpenRefine 文档 ( https://github.com/OpenRefine/OpenRefine/wiki/OpenRefine-API ) 不包含有关“选项”JSON 语法的任何提示。
我当前的代码如下所示:
import os
import xlrd
import csv
import requests
import re
xls_file_name_ext = os.path.basename('excel_file.xls')
# create the filename with path to the new csv file (path + name stays the same)
csv_file_path = os.path.dirname(xls_file_name_ext) + '/' + os.path.splitext(xls_file_name_ext)[0] + '.csv'
# remove all comma in xls file
xls_wb = xlrd.open_workbook(xls_file_name_ext)
xls_sheet = xls_wb.sheet_by_index(0)
for col in range(xls_sheet.ncols):
for row in range(xls_sheet.nrows):
_new_cell_val = str(xls_sheet.cell(row, col).value).replace(",", " ")
xls_sheet._cell_values[row][col] = _new_cell_val
# write to csv
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
c_w = csv.writer(csv_file, delimiter=',')
for row in range(xls_sheet.nrows):
c_w.writerow(xls_sheet.row_values(row))
ontorefine_server = 'http://localhost:7200/orefine'
# filename of csv as project name in OntoRefine
onterefine_project_name = os.path.splitext(os.path.basename(csv_file_path))[0]
# the required paraneters for the post request
ontorefine_data = {"project-name": onterefine_project_name,
"format": "text/line-based/*sv",
"options": {
"separator": ","
}
}
ontorefine_file = {'project-file': open(csv_file_path, "rb")}
# execute the post request
ontorefine_response = requests.post(
ontorefine_server + '/command/core/create-project-from-upload', data=ontorefine_data, files=ontorefine_file
)
我假设我错误地传递了 POST 请求参数。
解决方案
当然,这完全取决于您的输入数据,但格式看起来还不错。如果您尝试从 UI 导入,这就是 OntoRefine 在“幕后”所做的事情。您可以通过拦截网络流量为自己看到相同的有效负载:
{
"format": "text/line-based/*sv",
"options": {
"project-name":"Your-project-here",
"separator":","
}
由此看来,项目名称位置似乎是唯一的区别。这是一个 curl 命令,它执行相同的操作:
curl 'http://localhost:7200/orefine/command/core/importing-controller?controller=core%2Fdefault-importing-controller&jobID=1&subCommand=create-project' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' --data 'format%3Dtext%2Fline-based%2F*sv%26options%3D%7B%22separator%22%3A%22%2C%22%22projectName%22%3A%22Your-project-name%22%7D'
推荐阅读
- mysql - 替换MySql中JSON文档中键值对中的所有值
- javascript - Google 富文本编辑器演示未在本地主机上运行
- docker - 如何解决长期停留在“新”状态的 docker swarm 服务?[通过重新启动 swarm 集群解决短期问题]
- node.js - 为什么在咨询 mongo 时会出现服务器错误?
- android - Android 上的 Crashlytics 和 React Native
- javascript - 这种情况下 React useRef 和全局变量的区别
- c - gprof 以 0% 显示每个函数(甚至是摘要)
- python - 使用 SymPy 求解 ODE
- c++ - 运算符方法中的调用方法怪异行为
- swift - 更新解码的 JSON 并将其附加到结构中?