开发者

Converting string to tuple and adding to tuple

开发者 https://www.devze.com 2023-01-20 13:10 出处:网络
I have a config file like this. [rects] rect1=(2,2,10,10) rect2=(12,8,2,10) I need to loop through the values and convert them to tuples.

I have a config file like this.

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

I need to loop through the values and convert them to tuples. I then need to make a tuple of th开发者_StackOverflow社区e tuples like

((2,2,10,10), (12,8,2,10))


Instead of using a regex or int/string functions, you could also use the ast module's literal_eval function, which only evaluates strings that are valid Python literals. This function is safe (according to the docs). http://docs.python.org/library/ast.html#ast.literal_eval

import ast
ast.literal_eval("(1,2,3,4)") # (1,2,3,4)

And, like others have said, ConfigParser works for parsing the INI file.


To turn the strings into tuples of ints (which is, I assume, what you want), you can use a regex like this:

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

And you can use, say, configparser to parse the config file.


Considering that cp is the ConfigParser object for the cfg file having the config.

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

Edit : Changed eval() to a safer version literal_eval()
From python docs - literal_eval() does following :
Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None


You can simply make a tuple of tuples like

new_tuple = (rect1,rect2) # ((2,2,10,10), (12,8,2,10))

If you want to loop through values

for i in rect1+rect2:
    print i

If you want to regroup the numbers you could do

 tuple_regrouped = zip(rect1,rect2) #((2,12),(2,8),(10,2), (10,10))

EDIT: Didn't notice the string part. If you have lines in strings, like from reading a config file, you can do something like

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


The easiest way to do this would be to use Michael Foord's ConfigObject library. It has an unrepr mode, which'll directly convert the string into a tuple for you.

0

精彩评论

暂无评论...
验证码 换一张
取 消