繁体   English   中英

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

[英]Extracting variables from set of strings in 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:])

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

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}

尽管这可能不是实现您正在尝试的最佳方法,但以下是一种实现方法:

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

如果您信任类型转换。

稍作修改,就可以使用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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM