2016-04-01 17 views
0

私は比較的新しいPythonです。Python:文字列を変数とその値に変換する

私が書いているプログラムは、whileループを使って行ごとにXMLファイルを読み込みます。読み込まれたデータは分かれているので、私が取得する情報は次のようなものです:

datas = ['Name = "Date"'、 'Tag = "0x03442333"、' Level = "Acquisition" '、' Type = "文字列 "']

- 私のプログラムの中で、前の文字列の=記号の後の情報である=記号の前の単語と正確に呼ばれるいくつかの変数に割り当てる必要があります。そして私は(これはすでに動作します) クラスの属性としてそれらを紹介します - 瞬間があるまで、私が行っているもの:細かいそのように動作します - それ

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

for i in datas: 
    exec(i) 

を。しかし、私はexec関数を使いたくありません。それを行う他の方法はありますか?

+0

'exec'や' eval'を使うのが嫌な人は、SOベテランNed Batchelderの[Evalは本当に危険です](http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)をご覧ください。 。 –

答えて

1

execは、一般的にこのことについて移動するための方法です、ありがとうございました。 globals()ディクショナリに直接追加することもできますが、これは時には少し危険です。

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

unsanitizedデータに 'eval'を使うことは、' exec'を使うよりもそれほど危険ではありません。 –

1

あなたはセキュリティ上の理由からexecを避けるべきである、とあなたはおそらくdictまたは類似の構造内のフィールド値を保つ必要があることを右です。 Pythonライブラリに解析全体をさせる方が良いでしょう。例えば、ElementTreeを使用して:その後、

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

とXMLデータがどのように見えるかを正確に依存し、root上とその子を反復。

0

あなたが期待することは最大でここで説明します。 To convert string to variable name

しかし、理想的には、辞書を作成することです。このような。

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

注:まだevalの使用を避けます。

0

Pelle Nilsson氏によると、これには適切なXMLパーサーを使用する必要があります。ただし、データがシンプルで、XMLファイルの形式が安定している場合は、手で行うことができます。

このデータをクラスに入れる特別な理由はありますか?辞書はあなたが必要なすべてのことがあります。あなたがしたい場合

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

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

print(datadict) 

出力

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

あなたは、クラスに、このような辞書を渡すことができます。

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) 

出力

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

この回答のコードのすべてのあなたは、Python 2でそれを実行する場合は、の上部に

from __future__ import print_function 

を置くべきであるが、Pythonの2の最近のバージョンで同様のPython 3で正常に動作するはずですスクリプト。

関連する問題