2016-05-22 13 views
0

Ich bin wahrscheinlich in der Lage, dies selbst zu lösen, wenn ich die Zeit hätte, zu untersuchen. Ich habe verschiedene Dinge ausprobiert, aber ich kann es nicht zur Arbeit bringen! Ich mache meinen Master in Marketing, und es wird erwartet, dass wir in der Lage sind, in Python im Grunde zu programmieren, um einen Datensatz (json) in eine organisierte Textdatei zu parsen, die für weitere Analysen verwendet werden kann.Parsen von JSON mit versuchen und außer

Wir haben einen Datensatz mit vielen fehlenden Werten. Was ich analysieren möchte, ist dies: Künstler, mbid (Musik-Brain-Künstler-ID), Ereignisdaten, Name des Ortes, Stadt.

Dies ist (zum Teil) das Skript ich dafür geschrieben haben:

for event in setlists: 
    eventdate = event.get(u'@eventDate') 
    venuename = event.get(u'venue').get(u'@name') 
    mbid = event.get(u'artist').get(u'@mbid') 
    artistname = event.get(u'artist').get(u'@name') 
    city = event.get(u'venue').get(u'city').get(u'@name') 

    f = open(parse_file, 'a') 
    f.write(artistname+'\t'+mbid+'\t'+eventdate+'\t'+venuename+'\t'+city+'\n') 
    f.close() 

Dieses Skript funktioniert wie ein Charme, mit Ausnahme, dass es Einträge, für die Blätter dort fehlende Werte sind, beispielsweise keine Stadt.

Ich möchte es auf eine Zeile Text trotzdem melden, und "fehlt" für die fehlenden Informationen drucken.

Ich kann es nicht funktionieren und ich weiß auch nicht, wo ich anfangen soll. Ich habe versucht, Dinge wie diese:

f = open(parse_file, 'a') 
try: f.write(artistname) except: continue try: f.write(mbid) except:  continue... 
f.close() 

Jede Zeile in der analysierten Datei wie folgt wie sollte:

Künstlername MBID eventdate venuename Lage

Ich habe versucht, alles auf verschiedenen Linien zu setzen, aber dann ist das Problem war die Ausgabe vertikal und nicht horizontal für jedes Ereignis.

+2

Könnten Sie Beispiel-JSON-Datei und gewünschte Ausgabe hinzufügen? –

+0

Sie müssen versuchen: außer: Anweisungen in verschiedenen Zeilen. Das hat nichts mit der Formatierung der Dateiausgabe zu tun. – Keozon

+0

Ich habe versucht, dass Keozon. Versuchen Sie zu bekommen .... außer, weiter und dann noch ein Versuch und außer. Und dann, wenn ich f = open (parse_file, 'a') \t \t f.write (eventdate + '\ t' + Stadt + '\ n') \t \t f.close() wird es nach wie vor nur dann ausgegeben, die Kombinationen, in denen sowohl Variablen sind vorhanden ... – Luti

Antwort

0

Versuchen Sie - außer im ersten Block, wo Sie Daten in Ihrem Beispiel abrufen city = event.get(u'venue').get(u'city').get(u'@name') - Get fehlschlägt, so geschieht die gleiche Verarbeitung.

UPDATE:

Daten Gemäß vorgesehen - das ist, was funktioniert. Bitte beachten Sie, dass die angegebenen Daten keine JSON-Datei sind. Es ist eine Reihe von Zeilen, wo jede von ihnen JSON-Datei ist ... Deshalb habe ich Readlines gemacht und dann jede von ihnen verarbeitet. Es kann mehr pythisch, mehr Speicher effizient, aber ich wollte zeigen, wie das Problem zu lösen. Hoffe, es hilft:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import json 
from StringIO import StringIO 

with open('sample.json.txt') as data_file: 
    content = data_file.readlines() 

f = open('out_ok.txt', 'a') 
errors = open('out_errors.txt', 'a') 

try: 
    for ctx in content: 
     line = StringIO(ctx) 
     try: 
      json_data = json.load(line) 
     except UnicodeDecodeError: 
      errors.write('unicode: ' + ctx) 
      continue 
     event = json_data.get('setlists').get('setlist') 
     try: 
      eventdate = event.get(u'@eventDate') 
      venuename = event.get(u'venue').get(u'@name') 
      mbid = event.get(u'artist').get(u'@mbid') 
      artistname = event.get(u'artist').get(u'@name') 
      city = event.get(u'venue').get(u'city').get(u'@name') 
      f.write(artistname+'\t'+mbid+'\t'+eventdate+'\t'+venuename+'\t'+city+'\n') 
     except AttributeError: 
      errors.write('json: ' + json.dumps(event)) 
finally: 
    f.close() 
    errors.close() 
+0

Zunächst einmal danke für die Antwort! Wenn ich das ausführe, bekomme ich überhaupt keine Ausgabe, es gibt einen Fehler in jeder Zeile! – Luti

+0

Nun, so kann ich dir nicht helfen. Ich meine - bieten Beispiel-Events - dass ich es testen kann, und aktualisieren Sie meine Antwort ... –

+0

danke für die Antwort! – Luti

1

Also das ist definitiv nicht der Recht Weg, dies zu tun, aber da Sie in Eile sind ...

for event in setlists: 
    eventdate = event.get(u'@eventDate', 'missing') 
    venuename = event.get(u'venue', {u'@name': 'missing'}).get(u'@name', 'missing') 
    mbid = event.get(u'artist', {u'@mbid': 'missing'}).get(u'@mbid', 'missing') 
    artistname = event.get(u'artist', {u'@name': 'missing'}).get(u'@name', 'missing') 
    city = event.get(u'venue').get(u'city', {u'@name': 'missing'}).get(u'@name', 'missing') 

<etc> 

Die Idee ist, den Standard zu liefern Argumente für die .get so, dass Ihre verschachtelten .get-Methoden etwas zu .get haben: P

+0

'mbid = event.get (u'artist ', {u' @ mbid ':' missing '}). Get (' @ mbid ',' missing ')' könnte vereinfacht werden, um nur' mbid = event.get (u'artist ', {}). get (u' @ mbid ',' missing ') '- das heißt, der erste Aufruf muss nur ein leeres Diktat zurückgeben, da Sie beim zweiten Aufruf das Standardarg angeben bekommen. Tun Sie dies durchgängig und es räumt den Code ziemlich auf. Und ich weiß nicht, warum Sie sagen, das ist nicht der richtige Weg, dies zu tun, ich denke, dass es den Anforderungen gerecht wird, mit einem Minimum an Aufwand. – PaulMcG

+0

Das macht es ziemlich sauber, danke. Und du hast auch recht damit, die Anforderungen zu erfüllen. Ich denke, ein Teil von mir neigt dazu, die Daten ein wenig vorzuverarbeiten, so dass die .gets überflüssig sind, aber ich bin wahrscheinlich nur übermäßig pingelig: P –