我有一个像这样的配置文件。
[rects]
rect1=(2,2,10,10)
rect2=(12,8,2,10)
我需要循环遍历这些值并将它们转换为元组。 然后我需要将这些元组制作成一个元组。
((2,2,10,10), (12,8,2,10))
你可以使用 ast
模块的 literal_eval
函数来替代正则表达式或 int/string 函数,它只会评估有效 Python 字面量的字符串。根据文档,这个函数是安全的。
import ast
ast.literal_eval("(1,2,3,4)") # (1,2,3,4)
就像其他人所说,ConfigParser
适用于解析INI文件。
literal_eval
函数。它比直接使用eval
更好(甚至可能比正则表达式解析器更好?) - David Wolever要将字符串转换为整数元组(我假设这是您想要的),可以使用类似于以下的正则表达式:
x = "(1,2,3)"
t = tuple(int(v) for v in re.findall("[0-9]+", x))
你可以使用例如 configparser 来解析配置文件。
考虑到cp是具有配置的cfg文件的ConfigParser对象。
[rects]
rect1=(2,2,10,10)
rect2=(12,8,2,10)
>> import ast
>> tuple(ast.literal_eval(v[1]) for v in cp.items('rects'))
((2,2,10,10), (12,8,2,10))
编辑:将eval()更改为更安全的版本literal_eval()
从Python文档中可以得知,literal_eval()的作用如下:
安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串、数字、元组、列表、字典、布尔值和None
eval
可以工作...但在我看来,它不是这项工作的正确工具;可以使用一个简单的正则表达式来实现相同的目的,而没有任何风险。 - David Woleverast.literal_eval()
函数中并没有得到支持(我认为这可能是一个错误)。另一方面,eval('{1,2,3}')
确实能够工作。 - martineaunew_tuple = (rect1,rect2) # ((2,2,10,10), (12,8,2,10))
如果你想循环遍历数值
for i in rect1+rect2:
print i
tuple_regrouped = zip(rect1,rect2) #((2,12),(2,8),(10,2), (10,10))
编辑: 没有注意到字符串部分。如果您在字符串中有行,比如从读取配置文件中,您可以执行以下操作:
# line = "rect1 = (1,2,3,4)"
config_dict = {}
var_name, tuple_as_str = line.replace(" ","").split("=")
config_dict[var_name] = tuple([int(i) for i in tuple_as_str[1:-1].split(',')])
# and now you'd have config_dict['rect1'] = (1,2,3,4)