Search code examples
jsonpython-3.xapicsvcoingecko

Python3 save a json to a csv file from Coingeko API


I am struggling to convert a json file to a csv file. Any help would be appreciated. I am using Python3

Code

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 Result

{'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 Result

CSV Result

Thank You


Solution

  • Your JSON is nested which is list of lists. To read easily in CSV you must flatten it out I've reformatted the code to dump to CSV. check below

    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")