2016-04-01 10 views
0

Ich bin relativ neu in Python.Python: Verwandle einen String in eine Variable und ihren Wert

Das Programm, das ich schreibe liest Zeile für Zeile eine XML-Datei mit einer While-Schleife. Die gelesenen Daten sind so aufgeteilt, dass die Information, die ich bekomme, etwa lautet:

datas = ['Name = "Datum"', 'Tag = "0x03442333"', 'Level = "Erfassung"', 'Typ = " String "']

-Innerhalb meines Programms möchte ich einigen Variablen, die genau wie das Wort vor dem = -Zeichen benannt sind, die Informationen nach dem = -Zeichen in den vorherigen Strings zuweisen. Und dann werde ich sie als Attribute für eine Klasse einführen (das bereits funktioniert) - Was ich getan habe, bis der Moment ist:

Name = '' 
Tag = '' 
Level = '' 
Type = '' 

for i in datas: 
    exec(i) 

-IT fein auf diese Weise funktioniert. Ich möchte jedoch nicht die Exec-Funktion verwenden. Gibt es einen anderen Weg, das zu tun?

Danke

+0

Diejenigen, die sich wundern, was so schlecht ist mit 'exec' oder' eval', siehe [Eval ist wirklich gefährlich] (http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) von SO Veteran Ned Batchelder . –

Antwort

1

exec im Allgemeinen ist der Weg, um dies zu. Sie könnten es auch direkt zum globals() Wörterbuch hinzufügen, aber das wäre manchmal etwas gefährlich.

for pair in datas: 
    name, value = pair.split("=") 
    globals()[name] = eval(value) 
+0

Die Verwendung von 'eval' auf unsanitisierten Daten ist nicht wirklich weniger gefährlich als die Verwendung von' exec'. –

1

Sie haben Recht, dass Sie exec aus Sicherheitsgründen vermeiden sollten, und Sie sollten wahrscheinlich die Feldwerte in einer dict oder eine ähnliche Struktur halten. Es ist besser, eine Python-Bibliothek das ganze Parsing durchführen zu lassen. Zum Beispiel mit ElementTree:

import xml.etree.ElementTree as ET 
tree = ET.parse('myfile.xml') 
root = tree.getroot() 

und dann Iterieren über root und seine Kinder, je nachdem, wie genau Ihre XML-Daten aussehen.

0

Höchstens das, was Sie erwarten, wird hier besprochen. To convert string to variable name.

Aber was Sie idealerweise tun sollten, ist ein Wörterbuch zu erstellen. So was.

for i in datas: 
    (key,value)=i.split("=") 
    d[key] = eval(value) 

HINWEIS: Noch vermeiden eval.

0

Wie Pelle Nilsson sagt, sollten Sie dafür einen geeigneten XML-Parser verwenden. Wenn die Daten jedoch einfach sind und das Format Ihrer XML-Datei stabil ist, können Sie von Hand tun.

Haben Sie einen besonderen Grund, diese Daten in eine Klasse einzuordnen?Ein Wörterbuch kann alles sein, was Sie brauchen:

datas = ['Name="Date"', 'Tag="0x03442333"', 'Level="Acquisition"', 'Type="String"'] 

datadict = {} 
for s in datas: 
    key, val = s.split('=') 
    datadict[key] = val.strip('"') 

print(datadict) 

Ausgang

{'Tag': '0x03442333', 'Type': 'String', 'Name': 'Date', 'Level': 'Acquisition'} 

Sie können ein solches Wörterbuch zu einer Klasse übergeben, wenn Sie wollen:

class MyClass(object): 
    def __init__(self, data): 
     self.__dict__ = data 

    def __repr__(self): 
     s = ', '.join('{0}={1!r}'.format(k,v) for k, v in self.__dict__.items()) 
     return 'Myclass({0})'.format(s) 

a = MyClass(datadict) 
print(a) 
print(a.Name, a.Tag) 

Ausgang

Myclass(Tag='0x03442333', Type='String', Name='Date', Level='Acquisition') 
Date 0x03442333 

des Codes Alle in dieser Antwort sollte korrekt auf jede neue Version von Python 2 sowie auf Python 3 arbeiten, obwohl, wenn Sie es auf Python 2 laufen Sie

from __future__ import print_function 

an der Spitze des PUT sollten Skript.