将字符串转换为元组并添加到元组中

5

我有一个像这样的配置文件。

[rects]
rect1=(2,2,10,10)
rect2=(12,8,2,10)

我需要循环遍历这些值并将它们转换为元组。 然后我需要将这些元组制作成一个元组。
((2,2,10,10), (12,8,2,10))

1
问题在哪里?你是否在处理过程的某个特定部分遇到了麻烦,或者(令人不安)你想让我们为你编写代码? - Anthony
我对于合并元组感到困惑。很抱歉我没有表达清楚我的问题。 - giodamelio
5个回答

11

你可以使用 ast 模块的 literal_eval 函数来替代正则表达式或 int/string 函数,它只会评估有效 Python 字面量的字符串。根据文档,这个函数是安全的。

http://docs.python.org/library/ast.html#ast.literal_eval
import ast
ast.literal_eval("(1,2,3,4)") # (1,2,3,4)

就像其他人所说,ConfigParser适用于解析INI文件。


啊,有趣——我不知道literal_eval函数。它比直接使用eval更好(甚至可能比正则表达式解析器更好?) - David Wolever
好处是它可以避免你编写正则表达式,提供比正则表达式更多的功能(以防万一),并且是内置的。 - li.davidm

9

要将字符串转换为整数元组(我假设这是您想要的),可以使用类似于以下的正则表达式:

x = "(1,2,3)"
t = tuple(int(v) for v in re.findall("[0-9]+", x))

你可以使用例如 configparser 来解析配置文件。


谢谢点赞,但我认为Jeethu的答案——ConfigObject + unrepr——可能是更好的答案。 - David Wolever

3

考虑到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 Wolever
@David,同意使用eval是不安全的(这就是为什么我在原始解决方案中评论了谨慎使用eval())。我已经更改了代码,使用更安全的eval()版本,只有在这种情况下值为元组时才会进行评估,否则它将引发异常。 - Ashish
有趣的是,据说从Python 3.1移植到2.7的“集合字面量”在2.7的ast.literal_eval()函数中并没有得到支持(我认为这可能是一个错误)。另一方面,eval('{1,2,3}')确实能够工作。 - martineau

2
您可以简单地创建一个元组的元组,如下所示:
new_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)

2
这样做的最简单方法是使用Michael Foord的ConfigObject库。它有一个unrepr模式, 可以直接将字符串转换为元组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接