Как передать параметры JSON в пост-запрос «Создать проект» OpenRefine ReST-API? - PullRequest
1 голос
/ 10 апреля 2019

В настоящее время я пытаюсь загрузить таблицы Excel (в формате .xls) в модуль OpenRefine (или OntoRefine) Ontotexts GraphDB.Поскольку у меня были проблемы с загрузкой 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' и json сразделитель в параметре 'options' может быть добавлен в запрос POST.Однако это тоже не работает, и официальная документация OpenRefine (https://github.com/OpenRefine/OpenRefine/wiki/OpenRefine-API) не содержит никаких подсказок относительно синтаксиса JSON 'options'.

Мой текущий код выглядит так:

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.

1 Ответ

0 голосов
/ 15 апреля 2019

Конечно, все зависит от ваших входных данных, но форматирование выглядит нормально. Вот что 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'
...