如何从IBM沃森云中检索JSON格式的输出数据

3ks5zfa0  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(90)

我正在IBM沃森Cloud上使用Complex solver(Docplex)解决决策优化问题。但是,我在尝试调整输出格式时遇到了问题。
可用文档提供了以下函数,可将其包含在主文件中,以便将输出检索为**.csv文件**:

def write_all_outputs(outputs):
    '''Write all dataframes in ``outputs`` as .csv.

    Args:
        outputs: The map of outputs 'outputname' -> 'output df'
    '''
    for (name, df) in iteritems(outputs):
        csv_file = '%s.csv' % name
        print(csv_file)
        with get_environment().get_output_stream(csv_file) as fp:
            if sys.version_info[0] < 3:
                fp.write(df.to_csv(index=False, encoding='utf8'))
            else:
                fp.write(df.to_csv(index=False).encode(encoding='utf8'))
    if len(outputs) == 0:
        print("Warning: no outputs written")

然后在部署中,指定文件类型:

solve_payload = {
      
        client.deployments.DecisionOptimizationMetaNames.OUTPUT_DATA: [
            {
                "id" : ".*\.csv"
            }
        ]
    }

对于.csv文件,一切正常。
但是,我希望得到一个**.json文件**,因此我创建了相应的字典并修改了函数如下:

def write_all_outputs(outputs):
    for (name, content) in iteritems(outputs):
        json_file = '%s.json' % name
        with get_environment().get_output_stream(json_file) as fp:
            fp.write(json.dumps({name: content}).encode('utf-8'))
    if len(outputs) == 0:
        print("Warning: no outputs written")

在部署方面:

solve_payload = {
        client.deployments.DecisionOptimizationMetaNames.OUTPUT_DATA: [
            {
                "id" : ".*\.json"
            }
        ]
    }

该问题已正常解决(达到最优)。问题是我得到了一个奇怪的.JSON文件内容,其中包含随机字母。我怀疑write_all_outputs函数有问题。请注意,本地运行会生成一个正确的.JSON文件,没有任何问题。
我真的很感激任何关于我的问题的帮助。

fnvucqvd

fnvucqvd1#

对于那些遇到同样问题的人。我在IBM论坛上得到了答案。

  • 对于内联输出数据,除CSV文件外的所有文件都是base64编码的,因此您需要从作业详细信息中获取json的内容并对其进行解码。*
  • 例如,使用log.txt,它:*
import base64
    import io
    
    output_data = job_details['entity']['decision_optimization']['output_data']
    
    logs = [line for o in output_data if o['id'] == 'log.txt' for line in io.BytesIO(base64.b64decode(o['content']))]
    for l in logs:
        print(l)

相关问题