我有这个人。列表(这里介绍的玩具示例):
rasters = ['A','A.txt','B','B.txt']
我想删除.txt文件,所以这样做:
ras = [x for x in enumerate(rasters) if len(os.path.splitext(x)[1]) > 0]
但是,我收到此错误:*** AttributeError: 'tuple' object has no attribute 'rfind'
我该如何解决这个问题?
答案 0 :(得分:1)
只需从列表理解中删除enumerate
,然后在if语句中删除not
ras = [x for x in rasters if not len(os.path.splitext(x)[1]) > 0]
enumerate
会为栅格提供(索引,值)列表,而您只需要值。
也无需检查os.path.splitext(x)[1]
的长度,只需
ras = [x for x in rasters if not os.path.splitext(x)[1]]
如果bool
os.path.splitext(x)[1]
的{{1}}值将被视为''
字符串将被视为错误。
答案 1 :(得分:1)
enumerate(rasters)
会返回(index, element)
对的列表。您将该列表的每个元素传递给os.path.splitext
,它需要一个字符串。
您需要确保只将元素而不是包含元素及其索引的元组赋予splitext
。在实践中,这意味着将第二个元素从元组中投射出来:x[1]
。
您的病情也不正确。您正在选择带有扩展名的元素,而不是没有的元素。将> 0
更改为== 0
。
ras = [x for x in enumerate(rasters) if len(os.path.splitext(x[1])[1]) == 0]
这假设您打算在原始列表中保留项目的索引。如果您不想这样,则不应使用enumerate
。
ras = [x for x in rasters if len(os.path.splitext(x)[1]) == 0]