从python中的字符串集中提取变量

时间:2014-03-01 19:40:48

标签: python string

我有一组字符串,我提取并存储到数组中。其中一些包含我想要提取的变量,问题是这些是目前的字符串。例如,一个字符串看起来像

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:])

任何可以帮助我的建议/外部模块都将不胜感激

3 个答案:

答案 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'