一、问题提出
image_name = 'cropped_(25, 140, 39, 143)_obj365_val_000000685822.jpg'
start_idx = image_name.find("(")
end_idx = image_name.find(")")
coordinates = image_name.split('_')[1]
file_name_only = image_name[end_idx + 2:]
file_name_only, coordinates
我的输出结果为:
('obj365_val_000000685822.jpg', '(25, 140, 39, 143)')
坐标提取出来的是’(25, 140, 39, 143)',是一个字符串,我们如何将其转为元组?
二、解决方法
2.1 tuple()函数
new_coordinates = tuple(coordinates)
new_coordinates
我们的输出结果为:
('(',
'2',
'5',
',',
' ',
'1',
'4',
'0',
',',
' ',
'3',
'9',
',',
' ',
'1',
'4',
'3',
')')
直接使用tuple()函数将带有括号的字符串转换为元组时,元组的每个元素会被视为一个字符,而不是数字。在上述示例中,coordinates_str中的括号和数字被视为元组的不同元素,而不是整个元组的元素。
如果您确保输入的字符串中没有其他非数字字符,也可以使用字符串切片来手动提取数字,并将它们转换为整数。例如:
new_coordinates = tuple(map(int, coordinates[1:-1].split(',')))
new_coordinates
(25, 140, 39, 143)
我们的输出类型为:
在上述代码中,我们使用字符串切片 [1:-1] 来去掉字符串的括号,然后使用 split(‘,’) 来拆分字符串,并将每个拆分的部分转换为整数。最终得到正确的元组 (25, 140, 39, 143)。
让我们一步步解读这行代码:
- coordinates: 这是一个字符串变量,其值为 ‘(25, 140, 39, 143)’。它包含了您的坐标信息的字符串形式,其中包含括号和逗号。
- coordinates[1:-1]: 这是对coordinates字符串的切片操作。[1:-1]表示我们从字符串的索引1(第2个字符)开始取到索引-1(倒数第2个字符)之前的部分,去除了开头和结尾的括号。这样,我们得到的字符串为 ‘25, 140, 39, 143’,其中只包含了坐标的数字部分。
- coordinates[1:-1].split(‘,’): 接下来,我们使用split(‘,’)方法将刚才得到的字符串以逗号为分隔符进行拆分。这会返回一个包含拆分后的字符串的列表。在这个例子中,我们得到[‘25’, ‘140’, ‘39’, ‘143’]。
- map(int, coordinates[1:-1].split(‘,’)): 使用map()函数,我们将拆分后的字符串列表中的每个元素都映射到int()函数上。这样,我们将字符串类型的坐标数字转换为整数类型。
- tuple(map(int, coordinates[1:-1].split(‘,’))): 最后,我们使用tuple()函数将映射后的整数列表转换为元组。这样,我们得到了最终的元组 (25, 140, 39, 143),其中的每个元素都是整数类型。
通过这行代码,您成功将字符串形式的坐标信息 (25, 140, 39, 143) 转换为了一个包含整数的元组,并且可以在后续的处理中使用这个元组。
2.2 ast.literal_eval() 函数
ast.literal_eval()函数可以安全地将字符串转换为相应的Python数据结构,包括元组。
ast(Abstract Syntax Trees,抽象语法树)是Python的标准库之一,用于在Python代码中表示和处理代码的抽象语法结构。抽象语法树是一种树状的数据结构,它以抽象的方式表示代码的结构和语义。它可以帮助我们分析、操作和转换Python代码。
ast模块中包含了多个类和函数,用于将Python代码解析成抽象语法树,并提供了许多工具来处理和分析抽象语法树。以下是ast模块中一些重要的组件和用途:
- ast.parse(source, filename=‘’, mode=‘exec’): 这是ast模块中最常用的函数之一。它用于将源代码解析成抽象语法树。source参数是要解析的Python代码字符串,filename参数是用于错误报告的文件名,mode参数表示代码的执行模式。
- 抽象语法树节点类:ast模块中定义了多个节点类,每个类代表Python代码的不同语法结构,例如Module、FunctionDef、ClassDef、If、For、Call等等。每个节点类都有相应的属性,用于访问该节点的信息。
- ast.NodeVisitor类:这是ast模块中的一个基类,用于遍历抽象语法树。您可以继承ast.NodeVisitor类,并重写其中的方法来定义对抽象语法树节点的处理逻辑。
- ast.walk(node): 这是ast模块中的一个函数,用于遍历抽象语法树中的所有节点。它返回一个生成器,可以依次访问每个节点。
- ast.dump(node, annotate_fields=True, include_attributes=False): 这是ast模块中的一个函数,用于以字符串形式输出抽象语法树。它可以帮助您了解抽象语法树的结构。
- ast.literal_eval(node_or_string): 这是一个函数,用于安全地将字符串或抽象语法树节点转换为相应的Python数据结构。
使用ast模块,您可以在Python中分析代码,例如查找特定的语法结构,生成代码,或者进行代码变换和优化。它在代码静态分析、代码生成和代码转换等领域都有广泛的应用。同时,ast模块也是很多Python代码检查工具和代码重构工具的基础。
import ast
coordinates_str = '(25, 140, 39, 143)'
# 使用ast.literal_eval()将字符串转换为元组
coordinates_tuple = ast.literal_eval(coordinates_str)
print(coordinates_tuple) # 输出 (25, 140, 39, 143)
print(type(coordinates_tuple)) # 输出 <class 'tuple'>
在上述代码中,我们首先定义了一个字符串变量coordinates_str,它包含了您的坐标信息的字符串形式。然后,我们使用ast.literal_eval()函数将字符串转换为元组,并将结果保存在coordinates_tuple变量中。最后,我们输出coordinates_tuple的值和类型。
通过上述代码,您可以将字符串形式的坐标信息(25, 140, 39, 143)转换为真正的Python元组对象,方便在后续处理中使用。