2016-03-26 12 views
2

Ich versuche ein einfaches Datendateiformat einzurichten, und ich arbeite mit diesen Dateien in Python zur Analyse. Das Format besteht im Wesentlichen aus Header-Informationen, gefolgt von den Daten. Für Syntax- und zukünftige Erweiterbarkeitsgründe möchte ich ein JSON-Objekt für die Header-Information verwenden. Eine Beispieldatei sieht wie folgt aus:optimale Methode zum Analysieren eines JSON-Objekts in einer Datei

{ 
    "name": "my material", 
    "sample-id": null, 
    "description": "some material", 
    "funit": "MHz", 
    "filetype": "material_data" 
} 
18 6.269311533 0.128658208 0.962033017 0.566268827 
18.10945274 6.268810641 0.128691962 0.961950095 0.565591807 
18.21890547 6.268312637 0.128725463 0.961814928 0.564998228... 

Wenn die Datenlänge/Struktur immer gleich ist, das ist nicht schwer zu analysieren. Es brachte mir jedoch eine Frage über die flexibelste Möglichkeit, das JSON-Objekt zu analysieren, mit einer unbekannten Anzahl von Zeilen und einer unbekannten Anzahl geschachtelter geschweifter Klammern und möglicherweise mehr als einem JSON-Objekt in der Datei.

Wenn nur ein JSON-Objekt in der Datei ist, kann man diesen regulären Ausdruck verwenden:

with open(fname, 'r') as fp: 
    fstring = fp.read() 

json_string = re.search('{.*}', fstring, flags=re.S) 

Wenn jedoch mehr als ein JSON-String ist, und ich möchte den ersten packen, ich muss so etwas verwenden:

Ich denke die Frage wie immer: Gibt es einen besseren Weg, dies zu tun? Lieber einfacherer Code, flexiblerer Code, robusterer Code oder wirklich alles?

+0

bearbeiten möchten Verwenden Sie JSON für alle Daten, eine JSON-Struktur pro Datei. –

Antwort

1

Die einfachste Lösung, wie Klaus vorgeschlagen hat, besteht darin, nur JSON für die gesamte Datei zu verwenden. Das macht dein Leben viel einfacher denn als Schreiben ist nur json.dump und das Lesen ist nur json.load.

Eine zweite Lösung besteht darin, die Metadaten in eine separate Datei zu schreiben, die das Lesen und Schreiben auf Kosten mehrerer Dateien für jeden Datensatz einfach hält.

Eine dritte Lösung wäre, beim Schreiben der Datei auf die Festplatte, die Länge der JSON-Daten voranzustellen. So schreiben könnte wie etwas aussehen:

metadata_json = json.dumps(metadata) 
myfile.write('%d\n' % len(metadata_json)) 
myfile.write(metadata_json) 
myfile.write(data) 

Dann liest sieht aus wie:

with open('myfile') as fd: 
    len = fd.readline() 
    metadata_json = fd.read(int(len)) 
    metadata = json.loads(metadata) 
    data = fd.read() 

Eine vierte Option ist eine bestehende Speicherformat zu übernehmen (vielleicht hdf?), Die bereits die Funktionen, die Sie suchen in Bezug auf die Speicherung von Daten und Metadaten in der gleichen Datei.

+0

Ich denke darüber nach, alles im selben JSON zu halten, macht Sinn, obwohl ich aufgrund der Analyse immer noch neugierig bin, ob es eine andere Antwort darauf gibt. Ein Teil des Grundes, warum ich diese Frage gestellt habe, ist, dass ich die Möglichkeit der einfachen manuellen Dateierstellung durch Copy/Paste von Excel offen lassen wollte, mit der meine Firma reichlich arbeitet, und dass der Datenblock nach dem JSON das einfach macht. Nächste beste Lösung ist zu haben: "Daten": [ x, y1, y2, y3, y4, x, y1, y2, y3, y4 ....] obwohl dies erfordert ein bisschen suchen/ersetzen vor einfügen. –

0

Ich würde Header separat speichern. Es wird Ihnen eine Möglichkeit, die gleiche Header-Datei für mehrere Daten zu verwenden Dateien

Alternativ möchten Sie vielleicht einen Blick auf Apache Parquet Format nehmen vor allem, wenn Sie Ihre Daten auf verteilten Cluster (n) mit Spark power

Verwandte Themen