2017-09-21 2 views
2

Ich brauche einige Daten von der Meetup API, konvertieren Sie die JSON ich in eine CSV, alles in Python 3. Ich habe noch nie mit JSON oder Python gearbeitet, so dass ich ' Ich bin auf einige Probleme gestoßen. Das Abrufen der Daten ist kein Problem, aber ich kann das JSON-Objekt nicht als richtige CSV-Datei analysieren. Mein Code, anonymisiert:Konvertieren von JSON in CSV mit Python 3

import json 
import requests 
import csv 


def main(): 
    # initialize variables 
    output_file = 'result_meetup.csv' 
    api_key = "YOUR_MEETUP_API_KEY" 
    params = {'key': api_key} 
    url_path = 'http://api.meetup.com/pro/:URLNAME/groups' 

    # get data from API, parse to JSON 
    data = requests.get(url_path, params=params) 
    data_parsed = data.json() 
    length_data = len(data_parsed) - 1 

    data_to_file = open(output_file, 'w') 
    csv_writer = csv.writer(data_to_file) 

    for i in range(0, length_data): 
     meetup = data_parsed[i] 
     csv_writer.writerow([meetup]) 
    data_to_file.close() 


if __name__ == "__main__": 
    main() 

Nun, wie Sie sehen können, schreibe ich in die CSV als Liste. Dies führt zu einer wirklich hässlichen Ausgang, wie folgt aussehen (auch hier werden die Werte in den Kappen anonymisierten):

{u'rsvps_per_event': 0.0, u'organizers': [{u'permission': u'organizer', u'name': u'NAME', u'member_id': ID}], u'repeat_rsvpers': 0, u'topics': [{u'lang': u'en_US', u'id': ID, u'urlkey': u'socialnetwork', u'name': u'Social Networking'}, {u'lang': u'en_US', u'id': ID, u'urlkey': u'education', u'name': u'Education'}, {u'lang': u'en_US', u'id': ID, u'urlkey': u'newtech', u'name': u'New Technology'}, {u'lang': u'en_US', u'id': ID, u'urlkey': u'business-referral-networking', u'name': u'Business Referral Networking'}], u'upcoming_events': 0, u'gender_female': 0.3499999940395355, u'pro_join_date': DATE, u'id': ID, u'category': [{u'shortname': u'career-business', u'sort_name': u'Career & Business', u'id': 2, u'name': u'Career & Business'}], u'city': u'CITY', u'member_count': 73, u'lon': LON, u'organizer_photo': {u'thumb_link': u'LINK.JPEG', u'base_url': u'URL', u'id': ID, u'type': u'member', u'photo_link': u'LINK.JPEG', u'highres_link': u'LINK.JPEG'}, u'average_age': 35.555599212646484, u'status': u'Active', u'description': u'DESCRIPTION' u'founded_date': DATE, lat': LAT, u'urlname': u'NAME', u'gender_male': 0.6000000238418579, u'name': u'NAME', u'country': u'Portugal', u'gender_unknown': 0.05000000074505806, u'past_events': 0, u'gender_other': 0.0, u'past_rsvps': 0} 

Also im Grunde das ganze JSON-Objekt in einem einzigen CSV Feld, mit seltsamen ‚u ist, in Listen und bald. Wenn ich es jedoch nicht als Liste schreibe, erhalte ich nur die Felder des JSON-Objekts ohne die Daten, also wären es nur 'Organisatoren', 'Name' usw., ohne den eigentlichen Namen. Wie gesagt, ich bin ein Python-Anfänger und habe keine Bibliotheken gefunden, die mir dabei helfen könnten, aber ich bin mir sicher, dass sie existieren. Jede Hilfe wird wirklich geschätzt, und es wäre großartig, wenn es Python3-kompatibel wäre.

Bearbeiten: Wie ich es am Ende aussehen möchte: Ich bekomme mehrere Meetup-Gruppen in der Antwort, die alle die gleiche Struktur wie oben gezeigt haben. Daher sollte die Beschreibung des Wertes nur einmal aufgeführt werden, als Header und die Werte unter (neue Leitungen und Rohre ein neues Feld der csv-Blatt angibt) aufgeführt:

RSVPs_per_event | Organizer | ID 
5    | Tom  | 1 
20    | Jack  | 2 
35    | Anne  | 3 
+0

JSON eine stark verschachtelte Struktur haben kann, kann eine CSV nicht leicht, dass darstellen. Ich habe Ihre Antwort über [jsonlint] (https://jsonlint.com/) ausgeführt (was, obwohl dies tatsächlich ein Wörterbuch ist, ein lesbares Format ergibt) und da sind ziemlich viele Informationen drin. Sie müssen Ihre erwartete Ausgabe zeigen – roganjosh

+0

Im Idealfall, da alle JSON-Objekte in meiner Antwort die gleiche Struktur haben, wäre es toll, die Beschreibung des Werts, wie 'Organizer', nur einmal in einer Kopfzeile und dann die Werte jedes darunter aufgeführten Objekts. – alena

+0

So etwas wie: ** Organizer ** | Tom | Jack usw., aber untereinander, anstatt nebeneinander (kann nicht die Formatierung in einer Antwort tun) – alena

Antwort

0

Wenn jemand anderes das gleiche Problem hat, löste ich es, nicht sehr elegant, aber ich brauchte die Daten. Der JSON war zu eng eingebettet und komplex zum Parsen, also lese ich jetzt einfach die Felder, die ich brauche, aus den Daten.

import json 
import requests 
import csv 


def main(): 
    # initialize variables 
    output_file = 'result_meetup.csv' 
    api_key = "YOUR_API_KEY" 
    params = {'key': api_key} 
    url_path = 'http://api.meetup.com/pro/:URLNAME/groups' 

    # get data from API, parse to JSON 
    data = requests.get(url_path, params=params) 
    data_parsed = data.json() 
    length_data = len(data_parsed) - 1 

    data_to_file = open(output_file, 'w', newline='') 
    csv_writer = csv.writer(data_to_file, delimiter=";") 
    csv_writer.writerow(["id","name","city","country","member count","average age","founded_date","past_rsvps","rsvps_per_event","repeat_rsvpers","gender_unknown","gender_female","gender_male","gender_other"]) 

    for i in range(0, length_data): 
     meetup = data_parsed[i] 
     id = meetup['id'] 
     name = meetup['name'] 
     city = meetup['city'] 
     country = meetup['country'] 
     member_count = meetup['member_count'] 
     average_age = meetup['average_age'] 
     founded_date = meetup['founded_date'] 
     past_rsvps = meetup['past_rsvps'] 
     rsvps_per_event = meetup['rsvps_per_event'] 
     repeat_rsvpers = meetup['repeat_rsvpers'] 
     gender_unknown = meetup['gender_unknown'] 
     gender_female = meetup['gender_female'] 
     gender_male = meetup['gender_male'] 
     gender_other = meetup['gender_other'] 
     csv_writer.writerow([id,name,city,country,member_count,average_age,founded_date,past_rsvps,rsvps_per_event,repeat_rsvpers,gender_unknown,gender_female,gender_male,gender_other]) 
    data_to_file.close() 


if __name__ == "__main__": 
    main() 
0

Um wandeln die json Daten csv müssen Sie Schlüssel extrahieren und sie in den Header schreiben und dann an den Werten arbeiten. Dies könnte Ihnen helfen:

+0

nicht sicher, das würde funktionieren, da der Wert von "Organisatoren" ist eine Liste von Wörterbüchern –

+0

Ich habe diese Lösung versucht, und leider sieht das Ergebnis nicht viel besser aus. Es nimmt am Anfang die "{u'rsvps_per_event": "weg, aber der Rest sieht genauso aus. Danke aber – alena

+0

kann der JSON nicht richtig geparst werden. Können Sie versuchen, 'data_parsed = json.Lasten (Daten) ' –