2016-07-28 12 views
0

Ich habe eine Textdatei mit einem Satz von Arrays darin, die wie folgt aussieht:Importieren von strukturierten Daten in Python

[(0,1,3),(0,4,5),...(1,9,0)] 

[(9,8,7),(0,4,5),...(1,9,0)] 

wo die Zeilen sind nicht gleich lang sind. Diese

ist im wesentlichen eine Liste von Pfaden, wobei jeder Satz von Punkten ist ein Weg, das heißt:

(0,1,3),(0,4,5),...(1,9,0) =path1 

(9,8,7),(0,4,5),...(1,9,0) =path2 

Ich brauche zu importieren diese in einer Form, wo ich alle Elemente bezeichnen kann. Bsp. für alle Punkte in Pfad 1, bestimmen Sie die Entfernung zu allen Punkten in Pfad 2. Nicht sicher, wo zu beginnen, die Trennzeichen zu betrachten, wollen nicht Klammern und Kommas übergeben und dann Arrays in einer aufrufbaren Weise gebaut.

+0

Sie können eval in jeder Zeile verwenden, um Listen zu erstellen. –

+0

Meinst du importieren wie Daten aus einer Datei laden? – janbrohl

+0

eval ist ziemlich magisch ... Mal sehen, ob ich das machen kann Ja, es ist eine Textdatei. –

Antwort

0

Der folgende Code liest die Daten (unter Annahme eines Pfades pro Zeile und ohne zusätzliche Leerzeichen) in eine Liste mit numpligen Arrays ein und zeigt dann, wie der Abstand zwischen zwei Punkten berechnet wird.

import numpy as np 
import numpy.linalg as la 

#replace with your datafile 
datafile = "../data/point_path.txt" 
paths = [] 
with open(datafile, "r") as f: 
    for line in f: 
    point_strs = line.strip().strip("[()]").split("),(") 
    npoints = len(point_strs) 
    path = np.empty((npoints, 3)) 
    for i in xrange(npoints): 
     path[i,:] = np.array(map(int, point_strs[i].split(","))) 
    paths.append(path) 

print "First point of path 1:" 
print paths[0][0] 
print "Second point of path 2:" 
print paths[1][1] 

print "Euclidean Distance between these points:" 
print la.norm(paths[0][0]-paths[1][1]) 

Der Ausgang dieses ist:

First point of path 1: 
[ 0. 1. 3.] 
Second point of path 2: 
[ 0. 4. 5.] 
Euclidean Distance between these points: 
3.60555127546 

Edit: Wie Eingabedatei zu formatieren
Der Code geht davon aus, dass jede Liste von Punkten in einer eigenen Zeile ist (zB für Zeile in f , Liste der Punkte analysieren). Also die folgende Datei:

[(0,2,3),(0,4,0)] [(1,4,5),(5,8,9),(3,4,0)] [(0,5,7),(0,6,8),(1,5,6),(5,8,10)] 

wird nicht funktionieren, weil alle 3 Listen in der gleichen Zeile sind.

Dieses Format:

[(0,2,3),(0,4,0)] 
[(1,4,5),(5,8,9),(3,4,0)] 
[(0,5,7),(0,6,8),(1,5,6),(5,8,10)] 

funktionieren wird, da jede Liste von Punkten in einer separaten Zeile ist.

+0

Wenn Sie jede Zeichenfolge, die einem Pfad entspricht, in eine neue Zeile einfügen, sollte sie funktionieren. – bpachev

+0

So testet ich das auf [(0,2,3), (0,4,0)] [(1,4,5), (5,8,9), (3,4,0)] [(0,5,7), (0,6,8), (1,5,6), (5,8,10)], und es spuckte nur den letzten Pfad aus, wenn ich Pfade oder drucken wollte Pfad, und es konnte keine Pfade finden [1] [1]. Ich nehme an, das könnte etwas damit zu tun haben, dass jede Reihe eine andere Länge hat ... –

+0

Sorry, ich bin ein bisschen dick und es gibt einen Pfad, der oben ein paar Mal erwähnt wird ... was "legt jeden String einem Pfad" meine Codeform? –