首页 > 解决方案 > 如何在python中的api分页循环后编写可读的csv文件

问题描述

我无法将我的 api 调用循环的输出写入可读的 csv 文件。我对 python 很陌生,这可能是因为不同的数据格式。csv 仅包含 9 列,它不会将所有其他元素作为单独的列读取

import requests
import json
import pandas as pd

FileNaam = 'name'
   
params = (
    ('api_key', 'api_key'),
    ('since', '1595590000'),
    ('sort', 'asc')
)
url = 'https://a.klaviyo.com/api/v1/metrics/timeline'
discover_api = requests.get(url, params=params).json()
    
events = discover_api["data"]
next_id = discover_api["next"]

continueloop = 1

while continueloop ==1:
    params = (
        ('api_key', 'api_key'),
        ('since', next_id),
        ('sort', 'asc')
    )
    discover_apiloop = requests.get(url, params=params).json()
    events.extend(discover_apiloop["data"])
    if discover_apiloop["next"] is None:
        continueloop = 0
    else:
        next_id = discover_apiloop["next"]
  
data = json.dumps(events, sort_keys=True, indent=4)

df = pd.read_json(data)
df.to_csv(FileNaam+'.csv')

当我不循环但只执行一个 api 调用时,我使用不同的格式并且 csv 很好。所以下面的代码工作正常,但我希望在使用循环时得到相同的结果。

import requests
import json
import pandas as pd

FileNaam = 'name'

params = (
    ('api_key', 'api_key'),
    ('sort', 'asc'),
    ('since', '1595590000')
)

response = requests.get('https://a.klaviyo.com/api/v1/metrics/timeline', params=params)

responsetext = response.text
data = json.loads(responsetext)
df = pd.json_normalize(data['data'])
df.to_csv(FileNaam +'.csv')

如何转换我的输出以获得正确的 csv?

标签: pythonapiloopscsv

解决方案


在循环之后使用 json_normalize 让它工作

import requests
import json
import pandas as pd

bestandsNaam = 'name'

params = (
    ('api_key', 'api_key'),
    ('since', '1595650000'),
    ('sort', 'asc')
)
url = 'https://a.klaviyo.com/api/v1/metrics/timeline'
discover_api = requests.get(url, params=params).json()

events = discover_api["data"]
next_id = discover_api["next"]

continueloop = 1

while continueloop ==1:
    params = (
        ('api_key', 'api_key'),
        ('since', next_id),
        ('sort', 'asc')
    )
    discover_apiloop = requests.get('https://a.klaviyo.com/api/v1/metrics/timeline', params=params).json()
    events.extend(discover_apiloop["data"])
    if discover_apiloop["next"] is None:
        continueloop = 0
    else:
        next_id = discover_apiloop["next"]

df = pd.json_normalize(events)
df.to_csv(bestandsNaam+'.csv')

推荐阅读