我有一组字符串,我提取并存储到数组中。其中一些包含我想要提取的变量,问题是这些是目前的字符串。例如,一个字符串看起来像
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:])
任何可以帮助我的建议/外部模块都将不胜感激
答案 0 :(得分: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}
答案 1 :(得分: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])
如果您信任类型转换。
答案 2 :(得分: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'