在python中将来自API服务的嵌套JSON响应解析为csv

2024-09-27 09:31:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图以清晰有序的方式将API响应的输出保存到CSV文件中,这是检索API数据的脚本:

import json
import requests
import csv

# List of keywords to be checked
keywords = open("/test.txt", encoding="ISO-8859-1")

keywords_to_check = []

try:
    for keyword in keywords:
        keyword = keyword.replace("\n", "")
        keywords_to_check.append(keyword)
except Exception:
        print("An error occurred. I will try again!")
        pass

apikey = # my api key
apiurl = # api url
apiparams = {
    'apikey': apikey, 
    'keyword': json.dumps(keywords_to_check), 
    'metrics_location': '2840',
    'metrics_language': 'en',
    'metrics_network': 'googlesearchnetwork',
    'metrics_currency': 'USD',
    'output': 'csv'
}
response = requests.post(apiurl, data=apiparams)
jsonize = json.dumps(response.json(), indent=4, sort_keys=True)

if response.status_code == 200:
    print(json.dumps(response.json(), indent=4, sort_keys=True))

我得到的输出如下:

{
    "results": {
        "bin": {
            "cmp": 0.795286539,
            "cpc": 3.645033,
            "m1": 110000,
            "m10": 90500,
            "m10_month": 2,
            "m10_year": 2019,
            "m11": 135000,
            "m11_month": 1,
            "m11_year": 2019,
            "m12": 135000,
            "m12_month": 12,
            "m12_year": 2018,
            "m1_month": 11,
            "m1_year": 2019,
            "m2": 110000,
            "m2_month": 10,
            "m2_year": 2019,
            "m3": 110000,
            "m3_month": 9,
            "m3_year": 2019,
            "m4": 135000,
            "m4_month": 8,
            "m4_year": 2019,
            "m5": 135000,
            "m5_month": 7,
            "m5_year": 2019,
            "m6": 110000,
            "m6_month": 6,
            "m6_year": 2019,
            "m7": 110000,
            "m7_month": 5,
            "m7_year": 2019,
            "m8": 90500,
            "m8_month": 4,
            "m8_year": 2019,
            "m9": 90500,
            "m9_month": 3,
            "m9_year": 2019,
            "string": "bin",
            "volume": 110000
        },
        "chair": {
            "cmp": 1,
            "cpc": 1.751945,
            "m1": 1000000,
            "m10": 823000,
            "m10_month": 2,
            "m10_year": 2019,
            "m11": 1500000,
            "m11_month": 1,
            "m11_year": 2019,
            "m12": 1500000,
            "m12_month": 12,
            "m12_year": 2018,
            "m1_month": 11,
            "m1_year": 2019,
            "m2": 1000000,
            "m2_month": 10,
            "m2_year": 2019,
            "m3": 1000000,
            "m3_month": 9,
            "m3_year": 2019,
            "m4": 1220000,
            "m4_month": 8,
            "m4_year": 2019,
            "m5": 1220000,
            "m5_month": 7,
            "m5_year": 2019,
            "m6": 1000000,
            "m6_month": 6,
            "m6_year": 2019,
            "m7": 1000000,
            "m7_month": 5,
            "m7_year": 2019,
            "m8": 1000000,
            "m8_month": 4,
            "m8_year": 2019,
            "m9": 1000000,
            "m9_month": 3,
            "m9_year": 2019,
            "string": "chair",
            "volume": 1220000
        }, ....

我想要实现的是一个csv文件,显示以下信息和顺序,列为string、cmp、cpc和volume:

弦;化学机械抛光;中国共产党;音量
箱子0.795286539;3.645033;110000
椅子1.1.751945;1220000

根据Sidous的建议,我得出以下结论:

import pandas as pd
data = response.json()
df = pd.DataFrame.from_dict(data)
df.head()

哪个游戏向我提供以下输出:

结果
bin{'string':'bin','volume':110000,'m1':1100…
椅子{'string':'chair','volume':1220000,'m1':1…
花{'string':'flower','volume':1830000,'m1':…
表{'string':'table','volume':673000,'m1':82…
水{'string':'water','volume':673000,'m1':67…

关闭,但我如何才能将“字符串”、“卷”等显示为列,并避免显示词汇表中的“{”

非常感谢能帮我解决这个问题的人:)

歪斜


Tags: jsonstringyearm3m5volumekeywordsm4
3条回答

我建议将响应保存在pandas数据框中,然后由pandas存储(您知道csv文件很容易由pandas处理)

import pandas as pd


# receiving results in a dictionary
dic = response.json()

# remove the results key from the dictionary
dic = dic.pop("results", None)

# convert dictionary to dataframe
data = pd.DataFrame.from_dict(dic, orient='index')

# string;cmp;cpc;volume
new_data = pd.concat([data['string'], data['cmp'], data['cpc'], data['volume']], axis=1)

# removing the default index (bin and chair keys)
new_data.reset_index(drop=True, inplace=True)

print(new_data)

# saving new_data into a csv file
new_data.to_csv('name_of_file.csv')

您可以在python文件的同一目录中找到csv文件(否则可以在.to_csv()方法中指定它)

您可以在下面的屏幕截图中看到最终结果

enter image description here

试试这个:

import pandas as pd

data = response.json()
cleaned_data = []

for key, val in data["results"].items():
    cleaned_data.append(val)

df = pd.DataFrame.from_dict(cleaned_data)
df1 = df[["string","cmp","cpc","volume"]]
df1.head()
df1.to_csv("output.csv")

使用with open命令打开一个文本文件,并通过遍历整个dict进一步写下数据

with open("text.csv", "w+") as f:
    f.write('string;cmp;cpc;volume\n')
    for res in response.values():     #This is after I assumed that `response` is of type dict
        for r in res.values():
            f.write(r['string']+';'+str(r['cmp'])+';'+str(r['cpc'])+';'+str(r['volume'])+'\n')

相关问题 更多 >

    热门问题