展平 JSON 响应并输出到 csv
Flatten JSON response and output to csv
我似乎已经用尽了互联网来寻找常见的事情,我需要一些帮助。
我正在使用请求库进行 API 调用,每个调用 returns 一个 JSON 响应 - 我将循环并进行多次调用。
我想将许多 API 调用的所有响应合并到一个 python 数据结构中,然后将结果导出到 CSV。
一个 API 响应如下所示:
{
"status": "1",
"msg": "Success",
"data": {
"id": "12345",
"PriceDetail": [
{
"item": "Apple",
"amount": "10",
"weight": "225",
"price": "92",
"bestbeforeendeate": "30/09/2023"
}
]
}
}
我的最终输出应该是一个 CSV 文件,其中包含以下 headers 和后续行中的数据:
id
item
amount
weight
price
bestbeforeendeate
12345
apple
10
225
92
30/09/2023
.....
.....
..
...
..
..........
我研究过将响应组合到字典中,命名为元组、数据框,并尝试了各种选项以从所述结构导出到 dictwriter、csvwriter、normalize 等。不过,我仍在努力制作任何一个它有效。
我得到的最接近的是(我将结果保存到 JSON 文件以停止点击 API):
with open('item.json') as json_file:
data_set = json.load(json_file)
for data in data_set:
if data['msg'] == 'Success':
id = data['data']['id']
return_data[id] = data['data']['PriceDetail']
df = pd.json_normalize(data['data']['PriceDetail'])
print(df)
我无法将 id 添加到数据框
如有任何建议,我们将不胜感激。
谢谢,
Pandas有个函数叫json_normalize
,可以直接把dict转成dataframe。为了将 JSON 字符串转换为 dict
,您可以简单地使用 json
库。
我发现好的来源是 this`.
import json
import pandas as pd
# Test string, assuming it is from API
test_string = """{
"status": "1",
"msg": "Success",
"data": {
"id": "12345",
"PriceDetail": [
{
"item": "Apple",
"amount": "10",
"weight": "225",
"price": "92",
"bestbeforeendeate": "30/09/2023"
}
]
}
}"""
# Function converts the api result to the dataframe and appends it to df
def add_new_entry_to_dataframe(df, api_result_string):
input_parsed = json.loads(api_result_string)
df_with_new_data = pd.json_normalize(input_parsed['data']['PriceDetail'])
df = df.append(df_with_new_data)
return df
# The dataframe you want to store everything
df = pd.DataFrame()
## Loop where you fetch new data
for i in range(10):
newly_fetched_result = test_string
df = add_new_entry_to_dataframe(df, newly_fetched_result)
df = df.reset_index()
# Save as .csv
df.to_csv('output.csv')
print(df)
以上代码的输出:
item amount weight price bestbeforeendeate
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
编辑: 我重新审视了这个问题并认为我分享了另一个解决方案,这可能对你更好。下面的代码不是随着时间的推移构建一个巨大的数据框,而是将获取的数据直接附加到 CSV 文件中。优点是如果程序崩溃或终止它,所有数据都已经在 CSV 中。
# Function converts the json string to a dataframe and appends it directly to the CSV file
def add_json_string_to_csv(api_result_string):
input_parsed = json.loads(api_result_string)
df_with_new_data = pd.json_normalize(input_parsed['data']['PriceDetail'])
df_with_new_data.to_csv('output.csv', mode='a', header=False)
## Loop where you fetch new data
while (True):
newly_fetched_result = test_string
add_json_string_to_csv(newly_fetched_result)
我似乎已经用尽了互联网来寻找常见的事情,我需要一些帮助。
我正在使用请求库进行 API 调用,每个调用 returns 一个 JSON 响应 - 我将循环并进行多次调用。
我想将许多 API 调用的所有响应合并到一个 python 数据结构中,然后将结果导出到 CSV。
一个 API 响应如下所示:
{
"status": "1",
"msg": "Success",
"data": {
"id": "12345",
"PriceDetail": [
{
"item": "Apple",
"amount": "10",
"weight": "225",
"price": "92",
"bestbeforeendeate": "30/09/2023"
}
]
}
}
我的最终输出应该是一个 CSV 文件,其中包含以下 headers 和后续行中的数据:
id | item | amount | weight | price | bestbeforeendeate |
---|---|---|---|---|---|
12345 | apple | 10 | 225 | 92 | 30/09/2023 |
..... | ..... | .. | ... | .. | .......... |
我研究过将响应组合到字典中,命名为元组、数据框,并尝试了各种选项以从所述结构导出到 dictwriter、csvwriter、normalize 等。不过,我仍在努力制作任何一个它有效。
我得到的最接近的是(我将结果保存到 JSON 文件以停止点击 API):
with open('item.json') as json_file:
data_set = json.load(json_file)
for data in data_set:
if data['msg'] == 'Success':
id = data['data']['id']
return_data[id] = data['data']['PriceDetail']
df = pd.json_normalize(data['data']['PriceDetail'])
print(df)
我无法将 id 添加到数据框
如有任何建议,我们将不胜感激。
谢谢,
Pandas有个函数叫json_normalize
,可以直接把dict转成dataframe。为了将 JSON 字符串转换为 dict
,您可以简单地使用 json
库。
我发现好的来源是 this`.
import json
import pandas as pd
# Test string, assuming it is from API
test_string = """{
"status": "1",
"msg": "Success",
"data": {
"id": "12345",
"PriceDetail": [
{
"item": "Apple",
"amount": "10",
"weight": "225",
"price": "92",
"bestbeforeendeate": "30/09/2023"
}
]
}
}"""
# Function converts the api result to the dataframe and appends it to df
def add_new_entry_to_dataframe(df, api_result_string):
input_parsed = json.loads(api_result_string)
df_with_new_data = pd.json_normalize(input_parsed['data']['PriceDetail'])
df = df.append(df_with_new_data)
return df
# The dataframe you want to store everything
df = pd.DataFrame()
## Loop where you fetch new data
for i in range(10):
newly_fetched_result = test_string
df = add_new_entry_to_dataframe(df, newly_fetched_result)
df = df.reset_index()
# Save as .csv
df.to_csv('output.csv')
print(df)
以上代码的输出:
item amount weight price bestbeforeendeate
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
0 Apple 10 225 92 30/09/2023
编辑: 我重新审视了这个问题并认为我分享了另一个解决方案,这可能对你更好。下面的代码不是随着时间的推移构建一个巨大的数据框,而是将获取的数据直接附加到 CSV 文件中。优点是如果程序崩溃或终止它,所有数据都已经在 CSV 中。
# Function converts the json string to a dataframe and appends it directly to the CSV file
def add_json_string_to_csv(api_result_string):
input_parsed = json.loads(api_result_string)
df_with_new_data = pd.json_normalize(input_parsed['data']['PriceDetail'])
df_with_new_data.to_csv('output.csv', mode='a', header=False)
## Loop where you fetch new data
while (True):
newly_fetched_result = test_string
add_json_string_to_csv(newly_fetched_result)