Python: JSON ответ на CSV? - PullRequest
       5

Python: JSON ответ на CSV?

0 голосов
/ 10 июля 2019

Я вызываю API (https://min -api.cryptocompare.com / data / histoday? Fsym = BTC & tsym = USD & limit = 10 ), который дает следующий ответ:

{ "Ответ": "Успех", "Тип": 100, "агрегированный" ложь "Data": [{ "время": 1561852800, "близко": 10769,05, "высокий": 12200,02, "низкий": 10677,83, "открыть": 11884.1, "volumefrom": 80893.36, "volumeto": 917158052.37}, { "время": 1561939200, "закрыть": 10591,87, "высокий": 11207, "низкий": 10006,43, "открытый": 10769,05, "volumefrom": 115739,97, "volumeto": +1225129699,57}, { "время": 1562025600, "закрыть": 10844,13, "высокий": 10927,6, "низкий": 9678,1, "открыть": 10591,87, "volumefrom": 120994,95, "volumeto": +1239524970,43}, { "время": 1562112000, "закрыть": 11981,61, "высокий": 12009,59, "низкий": 10841,91, "открыто": 10844,13, "volumefrom": 115565,16, "volumeto": +1313585829,89}, { "время": 1562198400, "закрыть": 11156,52, "высокий": 12055,11, "низкий": 11067,68, "открыто": 11981,61, "volumefrom": 71141,03, "volumeto": 831236841,56}, {»время ": 1562284800," близко ": 10993,25," высокая ": 11435,38," низкий ": 10787,94," открыто ": 11156,52," volumefrom ": 66066,75," volumeto ": 734424868,07}, { "время": 1562371200, "закрыть": 11248,94, "высокий": 11709,27, "низкий": 10985,4, "открыто": 10993,25, "volumefrom": 48172,2, "volumeto": 549769169,13}, { "время": 1562457600," закрыть ": 11474,28," высокий ": 11605,43," низкий ": 11109,42," открыто ": 11248,94," volumefrom ": 36847,21," volumeto ": 418161890,29}, {" время ": 1562544000," закрыть": 12296,16," высокий ": 12386,28," низкий ": 11339,02," открыть ": 11474.28," volumefrom ": 63847.27," volumeto ": 762033323.29}, {" время ": 1562630400," закрыть ": 12537.38," высокий": 12808,06," низкий ": 12117,31," открыть ": 12296.16," volumefrom ": 79366.56," volumeto ": 990863142.59}, {" время ": 1562716800," закрыть ": 12855,54," высокий ": 12855,54," низкий": 12537,38," открыть ": 12537.38," volumefrom ": 0," volumeto ": 0}]," TimeTo ": 1562716800," TimeFrom ": 1561852800," FirstValueInArray ": правда," ConversionType ": {" тип»: "direct", "translationSymbol": ""}, "RateLimit": {}, "HasWarning": false}

Мне нужно преобразовать это в CSV со столбцами для time,close, high, low, open, volumefrom и volumeto в соответствии с вышеуказанным.Как это должно быть сделано?Я пробовал некоторые существующие ответы для преобразования json в csv, но в этом случае они не работают.

Ответы [ 3 ]

2 голосов
/ 10 июля 2019

Это довольно легко сделать с пандами:

import pandas as pd
import json

# Parse the json string to a python dictionary
data = json.loads(json_data)

# The desired data is in the `Data` field, use pandas to construct the data frame
df = pd.DataFrame(data["Data"])

# Save to a csv file
df.to_csv("result.csv")
1 голос
/ 10 июля 2019

Поскольку вы не упомянули об использовании файла, я просто сгенерировал значения через запятую без библиотеки csv. Однако это также можно было сделать с помощью it .

import requests
import json

r = requests.get("https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=10")

# this is assuming the response has no errors and is status code 200
data = json.loads(r.text)

# in csv the headers are conventionally the first row
csv_data = "time, close, high, low, open"

for row in data["Data"]:

    # since the order is specific, select the values from the row in that order
    row_data = [row["time"], row["close"], row["high"], row["low"], row["open"]]

    # here I am using list comprehension to convert all the data from the row to a string
    # then I use the .join method to concatonate all these values as one comma seperated list
    csv_row = ", ".join([str(j) for j in row_data])

    csv_data += "\n" + csv_row

# here is your data
print(csv_data)

Ссылки на документацию

  • запросы - широко используемая дружественная оболочка для библиотеки запросов Python.

  • Понимание списка - Более компактный способ создания списков в python, а также несколько более эффективный.

0 голосов
/ 10 июля 2019

Вот, пожалуйста!Это должно работать для вас!Не стесняйтесь задавать любые дополнительные вопросы, я постарался держать все комментарии и достаточно аккуратно.с:

#!/usr/bin/env python3
import json, csv

# Here is our input string/response. You can replace this!
responseString = '{"Response":"Success","Type":100,"Aggregated":false,"Data":[{"time":1561852800,"close":10769.05,"high":12200.02,"low":10677.83,"open":11884.1,"volumefrom":80893.36,"volumeto":917158052.37},{"time":1561939200,"close":10591.87,"high":11207,"low":10006.43,"open":10769.05,"volumefrom":115739.97,"volumeto":1225129699.57},{"time":1562025600,"close":10844.13,"high":10927.6,"low":9678.1,"open":10591.87,"volumefrom":120994.95,"volumeto":1239524970.43},{"time":1562112000,"close":11981.61,"high":12009.59,"low":10841.91,"open":10844.13,"volumefrom":115565.16,"volumeto":1313585829.89},{"time":1562198400,"close":11156.52,"high":12055.11,"low":11067.68,"open":11981.61,"volumefrom":71141.03,"volumeto":831236841.56},{"time":1562284800,"close":10993.25,"high":11435.38,"low":10787.94,"open":11156.52,"volumefrom":66066.75,"volumeto":734424868.07},{"time":1562371200,"close":11248.94,"high":11709.27,"low":10985.4,"open":10993.25,"volumefrom":48172.2,"volumeto":549769169.13},{"time":1562457600,"close":11474.28,"high":11605.43,"low":11109.42,"open":11248.94,"volumefrom":36847.21,"volumeto":418161890.29},{"time":1562544000,"close":12296.16,"high":12386.28,"low":11339.02,"open":11474.28,"volumefrom":63847.27,"volumeto":762033323.29},{"time":1562630400,"close":12537.38,"high":12808.06,"low":12117.31,"open":12296.16,"volumefrom":79366.56,"volumeto":990863142.59},{"time":1562716800,"close":12855.54,"high":12855.54,"low":12537.38,"open":12537.38,"volumefrom":0,"volumeto":0}],"TimeTo":1562716800,"TimeFrom":1561852800,"FirstValueInArray":true,"ConversionType":{"type":"direct","conversionSymbol":""},"RateLimit":{},"HasWarning":false}'

# Turn the response into JSON and only grab the 'Data' list.
responseString = json.loads(responseString)['Data']

# Open us a new file!
with open('output.csv', 'w') as output_csv_file:
    # Create us a new csv_object using the keys of the data as fieldnames.
    csv_object = csv.DictWriter(output_csv_file, fieldnames=responseString[0].keys())

    # For each row of data in the JSON, print it and write it to the CSV.
    for row in responseString:
        print(row)
        csv_object.writerow(row)

# Automatically close CSV file/object and print "Done!"
print("Done!")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...