Преобразование строки в кортеж и добавление в кортеж - PullRequest
4 голосов
/ 16 октября 2010

У меня есть такой конфигурационный файл.

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

Мне нужно перебрать значения и преобразовать их в кортежи. Затем мне нужно сделать кортеж из кортежей типа

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

Ответы [ 5 ]

11 голосов
/ 16 октября 2010

Вместо использования функций regex или int / string вы также можете использовать функцию literal_eval модуля ast, которая оценивает только строки, которые являются допустимыми литералами 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-файла.

9 голосов
/ 16 октября 2010

Чтобы превратить строки в кортежи целых чисел (что, я полагаю, то, что вы хотите), вы можете использовать такое регулярное выражение:

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

И вы можете использовать, скажем, configparser для разбора файла конфигурации.

3 голосов
/ 16 октября 2010

Учитывая, что cp является объектом ConfigParser для файла cfg, имеющего конфигурацию.

[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

2 голосов
/ 16 октября 2010

Самый простой способ сделать это - использовать библиотеку Майкла Фурда ConfigObject . Он имеет режим unrepr , который напрямую преобразует строку в кортеж для вас.

2 голосов
/ 16 октября 2010

Вы можете просто сделать кортеж из кортежей типа

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

EDIT: Не заметил строковую часть. Если у вас есть строки в строках, как при чтении файла конфигурации, вы можете сделать что-то вроде

 # 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...