我正在尝试像这样替换python中的字符串:
private_ips.replace("{",'')
我回来的错误是:
Traceback (most recent call last):
File ".\aws_ec2_list_instances.py", line 39, in <module>
private_ips.replace("{",'')
AttributeError: 'set' object has no attribute 'replace'
我在做什么错了?
答案 0 :(得分:1)
private_ips
是set
对象。您只能在字符串上使用替换。
要将集合表示为字符串,请使用以下代码段:
private_ips_as_string = '{' + ', '.join(str(elem) for elem in private_ips) + '}'
答案 1 :(得分:0)
让我们备份一下...
tree = objectpath.Tree(instance)
private_ips = set(tree.execute('$..PrivateIpAddress'))
您的最初问题是,您特定地将返回值转换为一个集合。如果您不需要一组,则不要将其转换为一个,也不要将其转换回对您更有用的东西。由于您未能提供Minimal, complete, verifiable example,因此我们无法修复所有问题,但在此我将进行直观的介绍...
tree.execute
返回IP地址列表。set
删除列表中的重复地址。如果是这样,那么您就可以了。要以字符串形式获取地址,我想您要遍历集合中的项目:
for ip_addr in private_ips:
# Handle ip_addr, a single IP address seen as a str.
如果您需要排列地址,则始终可以使用以下方式转换回列表
private_ips = list(private_ips)
...,如果您知道确切地有一个想要作为字符串的地址,则可以使用
single_ip = list(private_ips)[0]
...或者直接从函数的返回值中获取它:
single_ip = tree.execute('$..PrivateIpAddress')[0]
要解释您发生了什么 :
问题在于,一组没有括号。这些花括号在符号上是方便的。它们仅存在于数据类型的__repr__
(输出字符串表示形式)中,而不存在于集合本身中。您不能操作该表示。这就像尝试通过编辑问题文本来删除该问题的上投票箭头和下投票箭头:您不能这样做,因为它们是交付框架的一部分。
类似地,您不能删除字符串两端的引号,因为它们不是字符串的一部分。
要去除括号,您可以使用set
退出:进入内部并将内容作为单个元素拉出。