2017-09-08 4 views
0

Vous cherchez des moyens de convertir une matrice clairsemée (à partir d'un fichier texte) au format JSON (ce qui serait beaucoup plus facile à analyser dans une table HTML) en Python. Je ne cherche pas à réinventer la roue sauf si je dois le faire, donc s'il y a une bibliothèque qui fait déjà cela, s'il vous plaît faites le moi savoir!Python - Convertir une matrice clairsemée en JSON

Une entrée d'exemple serait (où le premier nombre est toujours 1 ou 0 - pour vrai ou faux, toutes les valeurs sont séparées par un espace, et des colonnes/indices sont indiqués par le numéro avant la virgule):

1 1:2 3:1 
1 2:3 

Pour vous aider les gars à comprendre l'entrée, au-dessous est la même entrée, juste avec zéro valeurs et têtes de colonne inclus:

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  

sortie préféré (en 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", 
     } 
] 

Répondre

1

Je pense que ce code peut résoudre votre problème:

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)) 

Considérant que votre matrice est dans le fichier matrix.txt, pour chaque ligne que vous obtenez la valeur du drapeau et de créer un dictionnaire de paires (colonne, valeur). Il est alors facile d'itérer sur la plage des colonnes possibles et d'obtenir la valeur du dictionnaire (0 si non trouvé) pour la i-ème colonne. Ici, je suppose que votre matrice a toujours 5 colonnes, changer le range sinon.

Enfin, vous pouvez utiliser la bibliothèque json pour convertir toutes les données générées. Le paramètre indent est utilisé juste pour "simuler" la sortie et la rendre plus lisible pour vous, il n'est pas nécessaire de l'utiliser dans votre code final.

+0

Merci, cela fonctionne! Le seul reproche que je reçois est que les colonnes sont dans l'ordre décroissant de la sortie (c'est-à-dire que Col5 est le premier et que le drapeau est le dernier). Devrait être assez facile à corriger si ... – RThomP

+0

La sortie que je reçois est correctement ordonnée, mais essayez d'ajouter un paramètre 'sort_keys = True' à' json.dumps'. De toute façon, gardez à l'esprit que les objets JSON n'assurent aucun ordre. De la [spécification officielle] (http://www.json.org/): _un objet est un ensemble non ordonné de paires nom/valeur. – 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") 

En utilisant cette fonction, vous pouvez obtenir json. Passez simplement le nom du fichier texte comme vous l'avez dit dans votre question.

+0

Bien que cela fonctionne techniquement; comme il prend le fichier texte et l'analyse dans une table JSON, il ne génère pas la sortie désirée (en générant des valeurs nulles lorsqu'il ne trouve pas de valeur pour ce numéro de colonne). – RThomP

+0

Pouvez-vous me donner votre I/P et la sortie désirée. J'ai essayé ça fonctionne bien pour moi. –

+0

L'entrée et la sortie sont dans l'OP ... – RThomP