2014-03-01 92 views
0

我有一組字符串,我將其提取並存儲到數組中。其中一些包含我想要提取的變量,問題是這些是目前的字符串。因此,例如,一個字符串看起來像從Python中的字符串集合中提取變量

s1 = 'DataFile=scan1.dat' 

其他看起來像

s2 = 'NumberOfChannels=32' 

我想要做的就是把S1和S2,並從他們的信息提取,並將其作爲例如:

DataFile='scan1.dat' 
NumberOfChannels=32 

這些字符串看起來都與上面的類似。它可以是包含字符串本身的變量,也可以是包含整數的變量。這是我的(失敗)的整數的情況下嘗試:

  # ll is a string element of the big array 

      if ll.startswith('NumberOfChannels'): 
       print "found nChans" 
       idx = ll.index('=') 
       vars()[ll[:idx-1]] = int(ll[idx+1:]) 

任何建議/外部模塊,這可以幫助我將不勝感激

+1

這是一個常見的問題,但這種做法在Python令人難以接受的,因爲它不僅是危險的(你可以很容易陰影內置)也是一個可怕的命名空間污染。將鍵/值存儲在字典中,一個單獨的名稱空間(或將虛擬對象用作名稱空間)。 –

回答

2
def convert(val): 
    """ 
    Attempt to coerce type of val in following order: int, float, str 
    """ 
    for type in (int, float, str): 
     try: 
      return type(val) 
     except ValueError: 
      pass 
    return val 

def make_config(*args, **kwargs): 
    for arg in args: 
     try: 
      key,val = arg.split('=') 
      kwargs[key.strip()] = convert(val.strip()) 
     except ValueError: # .split() didn't return two items 
      pass 
    return kwargs 

s1 = 'DataFile=scan1.dat' 
s2 = 'NumberOfChannels=32' 
config = make_config(s1, s2) 

,讓你

{'DataFile': 'scan1.dat', 'NumberOfChannels': 32} 
+0

爲了使用起來很方便,但爲什麼你要在'convert()'函數中轉換爲'str'?默認值爲'str' –

+0

這是一個性感的答案,謝謝@Hugh – elefun

1

雖然這可能不是什麼你實現的最佳途徑想,這裏是做這件事的方式:

string_of_interest = 'NumberOfChannels=32' 
string_split = string_of_interest.split('=') 
globals() [ string_split[0] ] = string_split[1] 

編輯:(從評論),你可以嘗試

globals() [ string_split[0] ] = eval(string_split[1]) 

如果您信任類型轉換。

+1

或者'eval(ll,globals())'如果你信任輸入。 – isedev

+0

Oooh我喜歡這個,很感謝 – elefun

+0

@isedev你在這種情況下是否嘗試過使用'eval()'?它產生一個SyntaxError異常。 –

1

稍作修改後,您可以使用exec作爲此;

In [1]: exec('NumberOfChannels = 32') 

In [2]: NumberOfChannels 
Out[2]: 32 

In [3]: exec('DataFile="scan1.dat"') 

In [4]: DataFile 
Out[4]: 'scan1.dat' 

注意,你應該從未飼料不可信代碼exec

並將隨機變量加載到您的程序通常是一個壞主意。如果變量名稱與程序中使用的某些名稱相同,該怎麼辦?

如果要存儲配置數據,請改爲查看json

In [6]: import json 

In [7]: json.dumps({'NumberOfChannels': 32, 'DataFile': 'scan1.dat'}) 
Out[7]: '{"DataFile": "scan1.dat", "NumberOfChannels": 32}' 

In [8]: json.loads('{"DataFile": "scan1.dat", "NumberOfChannels": 32}') 
Out[8]: {u'DataFile': u'scan1.dat', u'NumberOfChannels': 32} 

In [9]: config = json.loads('{"DataFile": "scan1.dat", "NumberOfChannels": 32}') 

In [10]: config['DataFile'] 
Out[10]: u'scan1.dat'