2012-09-11 12 views
5

Ich muss wissen, ob ich eine Variable in meinem Skript aus einer Deklaration in einer Textdatei einfach zuweisen kann. Grundsätzlich möchte ich, dass der Benutzer die Variable über die Textdatei so ändern kann, dass sie mit den benötigten Zahlen übereinstimmt, ohne sich mit dem Quellcode herumschlagen zu müssen.Importieren einer 3-D-List-Variablen aus einer Textdatei in Python

Textdatei Eingabeformat:

faultInfo = [ 
      [["L1603",1,5],[271585,972739],[272739,872739, 272739,972739, 271585,972739, 271585,272389, 270999,272389]], 
      [["L1605",1,5],[271897,872739],[272739,872739, 272739,972739, 271891,872739, 271891,272119, 270963,272119]], 
      [["L1607",1,4],[271584,272738],[271584,272738, 271584,272388, 270998,272388, 270998,272386]] 
      ] 

ich einfach diese in eine Liste Variable mit dem gleichen Namen in meinem Skript geladen werden soll. Ich bin neu bei Python und kein CS-Major oder so. Ich weiß, dass ich die 3-D-Liste mit Loops und so weiter laden könnte, aber es scheint, als sollte es einen schnellen Weg geben, dies zu tun, da die Größe der k-ten Dimension gezackt ist und sich von Fall zu Fall ändert.

Vielen Dank im Voraus.

Dank

Antwort

2

Diese Daten können einfach aussieht genug, dass man es analysieren kann mit entweder json.loads oder ast.literal_eval (beide in der Standardbibliothek):

>>> a = """[ 
...    [["L1603",1,5],[271585,972739],[272739,872739, 272739,972739, 271585,972739, 271585,272389, 270999,272389]], 
...    [["L1605",1,5],[271897,872739],[272739,872739, 272739,972739, 271891,872739, 271891,272119, 270963,272119]], 
...    [["L1607",1,4],[271584,272738],[271584,272738, 271584,272388, 270998,272388, 270998,272386]] 
...    ] 
... 
... """ 
>>> import ast 
>>> ast.literal_eval(a) 
[[['L1603', 1, 5], [271585, 972739], [272739, 872739, 272739, 972739, 271585, 972739, 271585, 272389, 270999, 272389]], [['L1605', 1, 5], [271897, 872739], [272739, 872739, 272739, 972739, 271891, 872739, 271891, 272119, 270963, 272119]], [['L1607', 1, 4], [271584, 272738], [271584, 272738, 271584, 272388, 270998, 272388, 270998, 272386]]] 
>>> import json 
>>> json.loads(a) 
[[[u'L1603', 1, 5], [271585, 972739], [272739, 872739, 272739, 972739, 271585, 972739, 271585, 272389, 270999, 272389]], [[u'L1605', 1, 5], [271897, 872739], [272739, 872739, 272739, 972739, 271891, 872739, 271891, 272119, 270963, 272119]], [[u'L1607', 1, 4], [271584, 272738], [271584, 272738, 271584, 272388, 270998, 272388, 270998, 272386]]] 

könnte man leicht die Zeichenfolge (a in meinem Beispiel) erhalten von 0.123.

+0

Dies ist, was ich abgesehen von einigen magischen direkten 1 zu 1 suchte. Danke! – scorpiknox

2

Sie können eine einzelne Datei Py machen, sagen configuration.py amd diese Variable in diese Datei setzen. Wenn der Benutzer die Zahlen in dieser Variablen ändern möchte, muss er diese Datei nur über einen einfachen Texteditor öffnen und die Fehler-Deklaration korrigieren.

+0

Ja, das würde mein letzter Ausweg sein. Ich plane jedoch, dieses Programm ein wenig zu erweitern und möchte im Grunde alle notwendigen Daten in eine Textdatei für die Benutzerfreundlichkeit zusammengefasst werden. – scorpiknox

0

Eine schnelle und schmutzige Methode ist die Verwendung der eval()-Funktion, wenn Sie die Zuweisung weglassen. Wie exemple, wenn die Datei, param.txt ist:

[ 
    [["L1603",1,5],[271585,972739],[272739,872739, 272739,972739, 271585,972739, 271585,272389, 270999,272389]], 
    [["L1605",1,5],[271897,872739],[272739,872739, 272739,972739, 271891,872739, 271891,272119, 270963,272119]], 
    [["L1607",1,4],[271584,272738],[271584,272738, 271584,272388, 270998,272388, 270998,272386]] 
] 

Eine einfache Art und Weise (wie ich schmutzig sagte) des Ladens wäre es:

with open('param.txt') as f: 
    file_text = ' '.join(f.readlines()) #Join lines with a blank ' ' space 
parameter = eval(file_text) 
+0

Danke, das ist interessant. Je mehr ich über Python lerne, desto mehr mag ich es. – scorpiknox

+0

@scorpiknox nur sehr vorsichtig sein mit 'eval', jemand könnte in Ihrer Datei etwas schreiben als' "os.system ('rm -rf /')" ', das könnte wirklich schlecht sein;). – Zenon

Verwandte Themen