Seite 1 von 1

Json Datei erstellen

Verfasst: Freitag 27. Oktober 2017, 14:37
von mit
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
    }
  ],
  ...
];

Re: Json Datei erstellen

Verfasst: Freitag 27. Oktober 2017, 14:50
von __deets__
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.

Re: Json Datei erstellen

Verfasst: Freitag 27. Oktober 2017, 15:03
von Sirius3
@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.

Re: Json Datei erstellen

Verfasst: Freitag 27. Oktober 2017, 15:54
von mit
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?

Re: Json Datei erstellen

Verfasst: Freitag 27. Oktober 2017, 16:06
von Sirius3
@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`.

Re: Json Datei erstellen

Verfasst: Freitag 27. Oktober 2017, 17:26
von pillmuncher
@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()

Re: Json Datei erstellen

Verfasst: Samstag 28. Oktober 2017, 13:10
von mit
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?

Re: Json Datei erstellen

Verfasst: Samstag 28. Oktober 2017, 14:26
von pillmuncher
@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,
}
...

Re: Json Datei erstellen

Verfasst: Samstag 28. Oktober 2017, 21:42
von mit
Ist es möglich die Zweite klammer `{` zu ersetzen mit `[` z.B. `[{"subject start":...` bekommt `[{"subject start":`?

Re: Json Datei erstellen

Verfasst: Sonntag 29. Oktober 2017, 03:11
von pillmuncher
@mit: ich verstehe die Frage nicht. Bitte erläutern.