3

我想了解如何修改列表的内容,特别是os.listdir().

文件名由多个重复的名称组成,后跟一个下划线,然后是后缀,然后是文件扩展名。我试图将列表中的元素缩减为文件名的第一部分,在 之前'_',所以:

apple_d.jpg
apple_si.jpg
apple_sg.jpg

成为列表中的一个条目,'apple'.

我能够摆脱重复并重新按字母顺序排列

list(sorted(set(t)))

但是从下划线开始删除所有内容被证明是棘手的。我试图通过.rpartition("_")[0]. 但这显然不适用于列表。所以我想知道如何解决这个问题?

编辑:好吧,不在这里工作。仍然得到重复,没有分裂。

objects = os.listdir(dir)





    for object in objects:
        sorted(set(object.split('_', 1)[0]))
        cmds.menuItem(label = object, parent = "objectMenu")

(最后一个命令是一个 Maya 命令,它填充一个选项菜单)。现在很累,所以我得稍后再接再厉。但是非常感谢迄今为止的帮助。肯定很快就会得到这个。

4

3 回答 3

5

使用str.split()orstr.rsplit()限制,然后选择第一个元素:

filename.split('_', 1)[0]

.rsplit('_', 1)将在最后一个下划线处拆分,在第一个下划线.split()处。选择最适合您用例的那个。

这将为您提供该文件名的第一个或最后一个下划线之前的所有内容。

在集合理解中使用它,并sorted()从该集合中返回一个列表:

unique_prefixes = sorted({filename.split('_', 1)[0] for filename in os.listdir(somedir)})

对于 Python 2.6 及更早版本,您还没有集合理解语法,下面的生成器表达式set()也可以工作:

unique_prefixes = sorted(set(filename.split('_', 1)[0] for filename in os.listdir(somedir)))
于 2013-05-21T20:57:25.320 回答
0

根据我对问题的理解,您尝试rpartition直接在列表上调用(也许像os.listdir('path').rparition('_')[0])。我相信要rpartition以您想要的方式使用,您需要将其应用于列表的各个元素。列表推导是最推荐的方法:

file_prefixes = [f.rpartition('_')[0] for f in os.listdir('path')]

正如 Martijin Pieters 所建议的那样,将其变成一个集合理解将消除重复:

file_prefixes = {f.rpartition('_')[0] for f in os.listdir('path')}

注意:这实际上应该等同于 Martijin Pieters 的答案,只是使用rpartition问题中提到的而不是rsplit. (基本上为您保存1参数。)

于 2013-05-21T21:19:38.390 回答
0

这对我有用-

labels = os.listdir(dir)




labels_processed=[]
for label in labels:
    labels_processed.append(label.split('_')[0])



labprocessed  = set(labels_processed)



for finallab in labprocessed:        
    cmds.menuItem(label = finallab, parent = "objectMenu")

干杯,

年代托泽

于 2013-05-23T13:54:14.827 回答