Python3 从 Coingeko API 将 json 保存到 csv 文件

Python3 save a json to a csv file from Coingeko API

我正在努力将 json 文件转换为 csv 文件。任何帮助,将不胜感激。我正在使用 Python3

代码

import json
import urllib.request

url = 'https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=1&interval=daily&sparkline=false'
req = urllib.request.Request(url)

##parsing response
myfile=open("coingecko1.csv","w",encoding="utf8")
headers="Prices,MrkCap,TolVol \n"
myfile.write(headers)

r = urllib.request.urlopen(req).read()
cont = json.loads(r.decode('utf-8'))

print (cont)#Just to check json result

for market in cont:
    prices =(cont["prices"])
    market_caps = (cont["market_caps"])
    total_volumes = (cont["total_volumes"])
    content= prices+","+str(market_caps)+","+str(total_volumes)+" \n"
    myfile.write(content)
print("job complete")

Python 结果

{'prices': [[1629331200000, 45015.46554608543], [1629361933000, 44618.52978218442]], 'market_caps': [[1629331200000, 847143004614.999], [1629361933000, 837151985590.3453]], 'total_volumes': [[1629331200000, 34668999387.83819], [1629361933000, 33367392889.386738]]}
Traceback (most recent call last):
  File "ma1.py", line 22, in <module>
    content= prices+","+str(market_caps)+","+str(total_volumes)+" \n"
TypeError: can only concatenate list (not "str") to list

CSV 结果

CSV Result

谢谢

您的 JSON 是嵌套的,即列表列表。要在 CSV 中轻松阅读,您必须将其展平 我已重新格式化代码以转储为 CSV。检查下面

import csv
import json
import urllib.request

url = 'https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=1&interval=daily&sparkline=false'
req = urllib.request.Request(url)

r = urllib.request.urlopen(req).read()

cont = json.loads(r.decode('utf-8'))

# flatten the JSON data to read csv easily
flatten_data = {}
for key in cont:
    for value in cont[key]:
        if value[0] not in flatten_data:
            flatten_data[value[0]] = {}
        flatten_data[value[0]].update({key: value[1]})

# write csv with DictWriter
with open('coingecko1.csv', 'w', encoding='utf-8') as csvfile:
    headers = ['Item', 'Prices', 'MrkCap', 'TolVol']
    writer = csv.DictWriter(csvfile, fieldnames=headers)

    writer.writeheader()
    for k, v in flatten_data.items():
        v.update({'Item': k})

        # renamed the columns as required
        v['Prices'] = v.pop('prices')
        v['MrkCap'] = v.pop('market_caps')
        v['TolVol'] = v.pop('total_volumes')
        writer.writerow(v)

print("job complete")