我正在从文件中提取一行数据,这一行的格式如下:
['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']
有没有办法将这些字符串转换为元组?我尝试过
x.strip() for x in row
,但没有帮助。提前致谢。
我正在从文件中提取一行数据,这一行的格式如下:
['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']
x.strip() for x in row
,但没有帮助。import ast
string = "['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']"
string = string.replace("'", "")
string = ast.literal_eval(string)
In : string
Out:
[(27.0, 168.0),
(32.0, 550.0),
(88.0, 835.0),
(46.0, 660.0),
(38.0, 430.0),
(34.0, 285.0),
(72.0, 701.0),
(29.0, 434.0),
(0, 2)]
In : type(string)
Out: list
In : [type(x) for x in string]
Out: [tuple, tuple, tuple, tuple, tuple, tuple, tuple, tuple, tuple]
< p > ast
模块评估字符串,如果我理解正确,这正是您要寻找的内容。
这应该就可以了。
from ast import literal_eval as make_tuple
a = ['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']
b = [make_tuple(x.strip()) for x in a]
eval
来实现。# bad practice
a = ['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']
b = [eval(tuple_str.strip()) for tuple_str in a]
更新
如下方评论所示,更安全的方法是使用literal_eval
。
eval
并不是必要的,而且可能应该避免使用。 - Will Da Silvaeval
。通过使用ast
模块中的literal_eval
,我们不必担心诸如代码注入之类的问题。它更安全,同样简单。 - Will Da Silva