您可以使用 braceexpand 从字符串列表中展开吗?

Can you use braceexpand to expand from a list of strings?

我想使用os.makedirs创建一个目录结构。我尝试使用 braceexpand,它部分起作用了:

for x in list(braceexpand('/Users/admin/Desktop/{cat,dog,bird}/{thing1,thing2,thing3,thing4}')): os.makedirs(x,exist_ok=True)

但我不想手动创建名为 'cat'、'dog' 和 'bird' 的目录,而是希望通过从列表创建结构来自动化该过程。

animals = [ 'cat', 'dog', 'bird']

这是因为我有时只需要中间目录 'dog',有时需要 'dog' 和 'cat',有时需要全部三个。因此,能够根据列表包含的任何动物子集创建目录结构会很好。

到目前为止我还没有能够实现这个(使用列表进行支撑扩展)。

在此处答案 (Brace expansion in python glob) 的帮助下,我能够使用嵌套的 for 循环和下面的代码创建我想要的目录结构。

for x in ['/Users/admin/Desktop/{s}/{b}'.format(b=b,s=s) for b in ['thing1','thing2','thing3','thing4'] for s in ['cat', 'dog', 'bird']]: os.makedirs(x,exist_ok=True)

但是我喜欢 braceexpand 的可读性,所以我很好奇是否有人知道如何用它来做——或者它是否可以做到。

谢谢!

在将字符串传递给 braceexpand 之前,您应该能够使用 Python 字符串插值 "hack" 它:

names = ['dog', 'cat', 'bird']    
print('/Users/admin/Desktop/{{{}}}/{{thing1,thing2,thing3,thing4}}'.format(','.join(names)))

产出

/Users/admin/Desktop/{dog,cat,bird}/{thing1,thing2,thing3,thing4}

当然也可以为thing1,thing2,...

做同样的事情

有关为什么需要 {{{}}}{{ ... }} 的解释,请参阅此 answer