2017-09-08 9 views
0

Suchen Sie nach Möglichkeiten, eine spärliche Matrix (aus einer Textdatei) in das JSON-Format (das viel einfacher in eine HTML-Tabelle zu parsen wäre) in Python zu konvertieren. Ich habe nicht vor, das Rad neu zu erfinden, es sei denn, ich muss es tun. Wenn also eine Bibliothek da ist, die das schon tut, lass es mich wissen!Python - Konvertieren einer dünn besetzten Matrix nach JSON

Ein Beispiel eingegeben werden würde (wobei die erste Zahl ist immer entweder 1 oder 0 - für wahr oder falsch, alle Werte werden durch ein Leerzeichen getrennt, und Spalten/Indizes werden durch die Zahl vor dem Doppelpunkt):

1 1:2 3:1 
1 2:3 

euch helfen, den Eingang zu verstehen, ist unter den gleichen Eingang, nur mit Null-Werten und Spaltenüberschriften enthalten:

Flag Col1 Col2 Col3 Col4 Col5 
1  1:2 2:0 3:1 4:0 5:0 
1  1:0 2:3 3:0 4:0 5:0  

Bevorzugte Ausgang (in JSON):

[ 
    { 
      Flag: "1", 
      Col1: "2", 
      Col2: "0", 
      Col3: "1", 
      Col4: "0", 
      Col5: "0", 
     } 
    { 
      Flag: "1", 
      COl1: "0", 
      Col2: "3", 
      Col3: "0", 
      COl4: "0", 
      Col5: "0", 
     } 
] 

Antwort

1

Ich denke, dieser Code Ihr Problem lösen kann:

import json 

with open('matrix.txt') as f: 
    content = [x.strip() for x in f.readlines()] 
    result = [] 
    for line in content: 
     elems = line.split(' ') 
     D = {x[0]:int(x[2]) for x in elems[1:]} 
     row = {"Col"+str(i):D.get(str(i),0) for i in range(1,6)} 
     row["Flag"] = int(elems[0]) 
     result.append(row) 
    print(json.dumps(result, indent=4)) 

Bedenkt man, dass Ihre Matrix in der Datei ist matrix.txt, für jede Zeile Sie den Flag-Wert erhalten und ein Wörterbuch von Paaren (Spalte, Wert) erstellen. Dann ist es einfach, über den Bereich der möglichen Spalten zu iterieren und den Wörterbuchwert (0 falls nicht gefunden) für die i-te Spalte zu erhalten. Hier nehme ich an, dass deine Matrix immer 5 Spalten hat, ändere sonst die range.

Schließlich können Sie die json Bibliothek verwenden, um alle generierten Daten zu konvertieren. Der Parameter indent wird nur verwendet, um die Ausgabe zu "verschönern" und für Sie lesbarer zu machen. Es ist nicht notwendig, sie in Ihrem endgültigen Code zu verwenden.

+0

Danke, das funktioniert! Die einzige Beschwerde, die ich habe, ist, dass die Spalten in der Ausgabe in absteigender Reihenfolge sind (d. H. Col5 ist zuerst und Flag ist zuletzt). Sollte aber ziemlich einfach zu beheben sein ... – RThomP

+0

Die Ausgabe, die ich bekomme, ist richtig geordnet, aber versuche, einen Parameter 'sort_keys = True' zu' json.dumps' hinzuzufügen. Beachten Sie in jedem Fall, dass JSON-Objekte keine Reihenfolge sicherstellen. Aus der [offiziellen Spezifikation] (http://www.json.org/): _ein Objekt ist eine ungeordnete Menge von Name/Wert-Paaren_. – stjernaluiht

1
import json 

def convertMatrix(file_name): 
    final_list = [] 
    try: 
     with open(file_name, "r") as sparse_mat: 
      matrix = sparse_mat.readlines() 

     for row in matrix: 
      each_dct = {} 
      row_vals = row.rstrip("\n").split() 

      if row_vals: 
       each_dct["Flag"] = row_vals[0] 
       for col_elem in row_vals[1:]: 
        if ":" in col_elem: 
         each_col_val = col_elem.split(":") 
         column_name = "Col"+each_col_val[0] 
         column_val = str(each_col_val[1]) 
         each_dct[column_name] = column_val 
       final_list.append(each_dct) 
    except Exception as e: 
     print "Exception occured", e 

    return final_list 


print convertMatrix("demo.text") 

Mit dieser Funktion können Sie Json erhalten. Übergeben Sie einfach den Namen der Textdatei, wie Sie in Ihrer Frage gesagt haben.

+0

Während dies technisch funktioniert; Da die Textdatei in eine JSON-Tabelle geschrieben und analysiert wird, generiert sie nicht die gewünschte Ausgabe (indem sie Nullwerte generiert, wenn für diese Spaltennummer kein Wert gefunden wird). – RThomP

+0

Können Sie mir Ihren i/p und gewünschte Ausgabe geben. Ich habe versucht, es funktioniert gut für mich. –

+0

Der Ein- und Ausgang ist im OP ... – RThomP

Verwandte Themen