使用 Pandas 将 JSON 转换为 CSV 时以非系列错误混合字典,但只有在从 URL 检索 JSON 时才会出现

Python 3.8.5 与 Pandas 1.1.3

使用 Pandas 将 Python JSON 字典列表转换为 CSV 的代码无任何问题:

import csv
import pandas as pd
import json

data = [{"results": [{"type": "ID", "value": "1234", "normalized": "1234", "count": 1, "offsets": [{"start": 14, "end": 25}], "id_b": "10"}, {"type": "ID", "value": "5678", "normalized": "5678", "count": 1, "offsets": [{"start": 32, "end": 43}], "id_b": "11"}], "responseHeaders": {"Date": "Tue, 25 May 2021 14:41:28 GMT", "Content-Type": "application/json", "Content-Length": "350", "Connection": "keep-alive", "Server": "openresty", "X-StuffAPI-ProcessedLanguage": "eng", "X-StuffAPI-Request-Id": "abcdef", "Strict-Transport-Security": "max-age=63072000; includeSubDomains; preload", "X-StuffAPI-App-Id": "123456789", "X-StuffAPI-Concurrency": "1"}}]

pd.read_json(json.dumps(data)).to_csv('file.csv')

上述代码中的 data 变量中的值直接从我们的一个服务的 API 调用响应中粘贴过来。当我尝试在一个脚本中执行包括 API 调用在内的所有操作时,问题就出现了。首先让我们看一下脚本中似乎没有问题的所有内容:

import csv
import pandas as pd
import json
import stuff.api

def run(key, url):
    # 创建一个 API 实例
    api = API(user_key=key, service_url=url)
    # 将文本文件中的数据提交到 API 解析器
    file1 = open("123.txt","r")
    text_data = file1.read()
    params = DocumentParameters()
    params["content"] = text_data
    file1.close()
    try:
        return api.data(params)
    except StuffAPIException as exception:
        print(exception)

if __name__ == '__main__':
    result = run('1234', 'https://192.168.0.125:8100/rest/')
    y = json.dumps(result)
    t = type(y)
    print(y)
    print(t)

上述的 print(y) 语句将返回我在第一个代码块中展示的确切数据。而 print(t) 语句是为了捕获返回类型,帮助我尝试诊断问题 - 其结果是 <class 'str'>

现在我们在 print(t) 行下添加如下代码 (与第一个代码块中完全相同):

pd.read_json(json.dumps(result)).to_csv('file.csv')

然后我收到了这个错误:

ValueError: Mixing dicts with non-Series may lead to ambiguous ordering.

我看到了很多关于这个错误的线程,但是似乎没有一个和这里发生的情况完全相关。

通过我迄今为止有限的经验,我猜测这个问题可能是由于返回类型是 string 导致的?我不确定,但这个排除故障步骤只是要克服的第一个障碍 - 我最终需要能够将数据解析成 CSV 文件的单独列,但现在,我只需要在没有错误的情况下将其放入 CSV 文件中。

我知道您无法完全重现这个问题,没有我服务器的访问权限,但希望这并不需要就能解决这个问题。

点赞