2016-08-10 2 views
0

ich ein Skript in python schreibe rekursiv durch jede Datei zu gehen, ein JSON-Objekt aus der Datei erstellen, die wie folgt aussieht:Python: Konvertieren einer Textdatei Multi-Level-JSON

target_id length eff_length est_counts tpm 
ENST00000619216.1 68 33.8839 2.83333 4.64528 
ENST00000473358.1 712 428.88 0 0 
ENST00000469289.1 535 306.32 0 0 
ENST00000607096.1 138 69.943 0 0 
ENST00000417324.1 1187 844.464 0 0 
ENST00000461467.1 590 342.551 3.44007 0.557892 
ENST00000335137.3 918 588.421 0 0 
ENST00000466430.5 2748 2405.46 75.1098 1.73463 
ENST00000495576.1 1319 976.464 11.1999 0.637186 

Das ist mein Skript :

import glob 
import os 
import json 

# define datasets 
# Dataset name 
datasets = ['pnoc'] 

# open file in append mode 
f = open('mydict','a') 

# define a new object 
data={} 

# traverse through folders of datasets 
for d in datasets: 
    samples = glob.glob(d + "/data" + "/*.tsv") 
    for s in samples: 
     # get the SampleName without extension and path 
     fname = os.path.splitext(os.path.basename(s))[0] 

     # split the basename to get sample name and norm method 
     sname, keyword, norm = fname.partition('.') 

     # determing Normalization method based on filename 
     if norm == "abundance": 
      norm = "kallisto" 
     elif norm == "rsem_genes.results": 
      norm = "rsem_genes" 
     else: 
      norm = "rsem_isoforms" 

     # read each file 
     with open(s) as samp: 
      next(samp) 
      for line in samp: 
       sp = line.split('\t') 
       data.setdefault(sname,[]).append({"ID": sp[0],"Expression": sp[4]}) 
       json.dump(data, f) 
f.close() 

ich ein JSON-Objekt auf den folgenden Zeilen möchten:

# 20000 Sample names, 3 Normalization methods and 60000 IDs in each file. 
DatasetName1 { 
    SampleName1 { 
     Type { 
      Normalization1 { 
       { ID1: value, Expression: value }, 
       { ID2: value, Expression: value }, 
       ... 
       { ID60000: value, Expression: value } 
      }, 
      Normalization2 { 
       { ID1: value, Expression: value }, 
       { ID2: value, Expression: value }, 
       ... 
       { ID60000: value, Expression: value } 
      }, 
      Normalization3 { 
       { ID1: value, Expression: value }, 
       { ID2: value, Expression: value }, 
       ... 
       { ID60000: value, Expression: value } 
      } 
     } 
    }, 
    SampleName2 { 
     Type { 
      Normalization1 { 
       { ID1: value, Expression: value }, 
       { ID2: value, Expression: value }, 
       ... 
       { ID60000: value, Expression: value } 
      }, 
      Normalization2 { 
       { ID1: value, Expression: value }, 
       { ID2: value, Expression: value }, 
       ... 
       { ID60000: value, Expression: value } 
      }, 
      Normalization3 { 
       { ID1: value, Expression: value }, 
       { ID2: value, Expression: value }, 
       ... 
       { ID60000: value, Expression: value } 
      } 
     } 
    }, 
    ... 
    SampleName20000{ 
     Type { 
      Normalization1 { 
       { ID1: value, Expression: value }, 
       { ID2: value, Expression: value }, 
       ... 
       { ID60000: value, Expression: value } 
      }, 
      Normalization2 { 
       { ID1: value, Expression: value }, 
       { ID2: value, Expression: value }, 
       ... 
       { ID60000: value, Expression: value } 
      }, 
      Normalization3 { 
       { ID1: value, Expression: value }, 
       { ID2: value, Expression: value }, 
       ... 
       { ID60000: value, Expression: value } 
      } 
     } 
    } 
} 

Also meine Frage ist - Wie stelle ich beim Konvertieren einer Textdatei in JSON die Ebenen in meiner JSON-Ausgabe ein?

Danke!

+2

Können Sie dies auf einen MCVE reduzieren? Ich glaube nicht, dass es einen Grund gibt, so viele Informationen in Ihre Frage aufzunehmen, woran Sie arbeiten und wie Sie Ihre Dateien benannt haben. Produzieren Sie ein sehr einfaches Beispiel für ein halbes Dutzend Zeilen, die zeigen, was Sie tun möchten. –

+0

Gibt es einen besonderen Grund, 8 Leerzeichen zu verwenden? – chapelo

+0

@ Two-BitAlchemist Ich habe meine Frage aktualisiert. –

Antwort

0

Zuerst sollten Sie anstatt den Standardwert immer wieder zu setzen, defaultdict verwenden.

Zweitens, ich glaube, Ihre vorgeschlagene Struktur aus ist, und Sie sollten einige Arrays innerhalb (JSON-ähnliche Struktur) werden:

{ 
    DatasetName1: { 
     SampleName1: { 
      Type: { 
       Normalization1: [ 
        { ID1: value, Expression: value }, 
        { ID2: value, Expression: value }, 
        ... 
        { ID60000: value, Expression: value } 
       ], 
       Normalization2: [ 
        { ID1: value, Expression: value }, 
        { ID2: value, Expression: value }, 
        ... 
        { ID60000: value, Expression: value } 
       ], 
       Normalization3: [ 
        { ID1: value, Expression: value }, 
        { ID2: value, Expression: value }, 
        ... 
        { ID60000: value, Expression: value } 
       ] 
      } 
     }, 
     SampleName2: { 
      Type: { 
       Normalization1: [ 
        { ID1: value, Expression: value }, 
        { ID2: value, Expression: value }, 
        ... 
        { ID60000: value, Expression: value } 
       ], 
       Normalization2: [ 
        { ID1: value, Expression: value }, 
        { ID2: value, Expression: value }, 
        ... 
        { ID60000: value, Expression: value } 
       ], 
       Normalization3: [ 
        { ID1: value, Expression: value }, 
        { ID2: value, Expression: value }, 
        ... 
        { ID60000: value, Expression: value } 
       ] 
      } 
     }, 
     ... 
     SampleName20000: { 
      Type: { 
       Normalization1: [ 
        { ID1: value, Expression: value }, 
        { ID2: value, Expression: value }, 
        ... 
        { ID60000: value, Expression: value } 
       ], 
       Normalization2: [ 
        { ID1: value, Expression: value }, 
        { ID2: value, Expression: value }, 
        ... 
        { ID60000: value, Expression: value } 
       ], 
       Normalization3: [ 
        { ID1: value, Expression: value }, 
        { ID2: value, Expression: value }, 
        ... 
        { ID60000: value, Expression: value } 
       ] 
      } 
     } 
    }, { 
    DatasetName2: { 
     ... 
    }, ... 
} 

So Ihre resultierende Code (ungetestet) sollte wie folgt aussehen (lange Ihre Norm-Methodenlogik ist korrekt):

Dies speichert das Ergebnis in einem JSON-Format.

+0

Ich habe die ersten Zeilen meiner Datei gepostet. Ich verstehe nicht, was die Bindestriche in 'id, _, __, ___, tpm' sind? Ich bekomme diesen Fehler. '' 'für (id, _, __, ___, tpm) in (line.split ('\ t') für Zeile in samp): ValueError: E/A-Operation bei geschlossener Datei''' –

+0

Was ist' Beispiel = {"Type": defaultdict (list)} 'tu? –

+0

@KomalRathi Die Bindestriche sind nur Variablennamen, die verwendet werden, um Variablen anzuzeigen, die nicht verwendet werden. Fühlen Sie sich frei, Namen zu ihnen hinzuzufügen, wenn Sie vorhaben, es zu verwenden. Sie erhalten diesen Fehler, weil diese for-Schleife nicht eingerückt ist. Für Ihren zweiten Kommentar wird 'sample' auf ein' dict' mit einem einzigen Schlüssel namens ** Type ** gesetzt, und der Wert für diese Taste ist ein 'dict', dessen Werte eine' liste' sind, wenn auf * any zugegriffen wird Schlüssel*. Hier leuchtet ['defaultdict'] (https://docs.python.org/2/library/collections.html#collections.defaultdict). –

Verwandte Themen