Json Datei erstellen

Django, Flask, Bottle, WSGI, CGI…
Antworten
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
Ich habe diese Datei:

Code: Alles auswählen

query   | subject     | query  start | query end | subject start | Subject end
Locus_1 | tig00007234 | 1            | 1054      | 140511        | 137383
Locus_1 | tig00007234 | 1            | 1057      | 77478         | 74353
...
und diese Methode liest die obere Datei ein:

Code: Alles auswählen

def read_relationship(filename):
    with open(filename) as f:
        for line in f:
            try:
                parts = line.rstrip().split('|')
                query_name = parts[0]
                subject_name = parts[1]
                query_start = parts[2]
                query_end = parts[3]
                subject_start = parts[4]
                subject_end = parts[5]
            except ValueError:
                continue
Wie ist möglich die untere Ausgabe zu bekommen?

Code: Alles auswählen

var data = [
  [
    source: {
      id: 'Locus_1',
      start: 1,
      end: 1054
    },
    target: {
      id: 'tig00007234',
      start: 140511,
      end: 137383
    }
  ],
  [
    source: {
      id: 'Locus_1',
      start: 1,
      end: 1057
    },
    target: {
      id: 'tig00007234',
      start: 77478,
      end: 74353
    }
  ],
  ...
];
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du die Datenstruktur hinschreibst so wie du das schon getan hast, nur in Python, und mit deinen vorher befuellten Variablen. Du solltest ausserdem erwaegen das Modul csv fuer das einlesen der Datei zu verwenden, statt das von Hand hinzubasteln.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@mit: willst Du nun eine Datenstruktur haben, die aus Wörterbüchern aufgebaut ist, oder willst Du als Ausgabe exakt die seltsame Syntax, die Du da zeigst? Das wären dann zwei Schritte, der Funktionsname läßt nur ersteren vermuten. Erstens die Daten in eine Liste mit Wörterbüchern überführen und zweitens, die Liste ausgeben. Wo hast Du bei einem der Schritte welche Schwierigkeiten?

Zum Code: `continue` sollte man nur mit guter Begründung verwenden, weil es den Programmfluß schwieriger nachvollziehbar macht. Hier ist es sogar komplett überflüssig und kann durch `pass` ersetzt werden. Der try-Block ist überflüssig, da innerhalb kein ValueError auftreten kann. Zudem ist es höchstwahrscheinlich unerwünscht, dass fehlerhafte Daten einfach so ignoriert werden, ohne eine Meldung auszugeben. Die Headerzeile sollte explizit am Anfang gelesen und ignoriert werden.

Benutze am besten aus dem csv-Modul `DictReader`, der behandelt den Header automatisch richtig.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Diese Datenstruktur benötige ich für https://github.com/nicgirault/circosJS#chords . Ich bin mir immer noch nicht sicher wie dies Datenstruktur erhalte. Muss ich das json Modul importieren?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@mit: wenn Du eine JSON-Serialisierung in dieser Form haben willst, dann nimm das json-Modul, lese die Daten in eine Liste von Wörterbüchern und benutzt `json.dump`.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@mit:

Code: Alles auswählen

#!/usr/bin/env python3
# coding: utf-8

import csv
import io
import json

data = '''
query   | subject     | query  start | query end | subject start | Subject end
Locus_1 | tig00007234 | 1            | 1054      | 140511        | 137383
Locus_1 | tig00007234 | 1            | 1057      | 77478         | 74353
'''

def identity(x):
    return x

transmogrifiers = {
    'query': identity,
    'subject': identity,
    'query  start': int,
    'query end': int,
    'subject start': int,
    'Subject end': int,
}

def massage(a_dict):
    return {k.strip(): transmogrifiers[k.strip()](v.strip())
            for k, v in a_dict.items()}

def read_data(data_file):
    for row in csv.DictReader(data_file, delimiter='|', skipinitialspace=True):
        yield massage(row)

def main():
    print(json.dumps(list(read_data(io.StringIO(data.strip())))))

if __name__ == '__main__':
    main()
In specifications, Murphy's Law supersedes Ohm's.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Leider bekomme ich folge Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/projects/circos/test.py", line 44, in <module>
    main()
  File "/projects/circos/test.py", line 40, in main
    print(json.dumps(list(read_data(io.StringIO(data.strip())))))
TypeError: initial_value must be unicode or None, not str
Was habe ich vergessen?
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@mit: entweder Python3 verwenden oder statt Strings eben Unicode nehmen:

Code: Alles auswählen

...
data = u'''
query   | subject     | query  start | query end | subject start | Subject end
Locus_1 | tig00007234 | 1            | 1054      | 140511        | 137383
Locus_1 | tig00007234 | 1            | 1057      | 77478         | 74353
'''
...
transmogrifers = {
    u'query': identity,
    u'subject': identity,
    u'query  start': int,
    u'query end': int,
    u'subject start': int,
    u'Subject end': int,
}
...
In specifications, Murphy's Law supersedes Ohm's.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Ist es möglich die Zweite klammer `{` zu ersetzen mit `[` z.B. `[{"subject start":...` bekommt `[{"subject start":`?
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@mit: ich verstehe die Frage nicht. Bitte erläutern.
In specifications, Murphy's Law supersedes Ohm's.
Antworten