0

我一直在尝试将子目录添加到“项目”列表中,并已决定使用以下代码完成此操作。

root, dirs, files = iter(os.walk(PATH_TO_DIRECTORY)).next()
items = [{
     'label': directory, 'path': plugin.url_for('test')
} for count, directory in enumerate(dirs)]

上述方法有效,但速度非常慢。os.walk 非常快,但由于某种原因循环很慢。

我尝试一口气完成所有操作,在 os.walk 期间添加到“项目”列表,如下所示

for root, dirs, files in os.walk(PATH_TO_DIRECTORY):

但无法完全获得将目录添加到列表的正确语法。

我可以在网上找到的每个 os.walk 示例都简单地做了一个printdirs 或 files,作为它的使用示例很好 - 但在现实世界中并不是很有用。

我是python新手,今天才开始看它。有人可以建议如何获得像我的第一个示例中的列表但没有单独的循环吗?

(我意识到它在 python 中被称为“目录”或其他东西,而不是列表。让我们称之为数组并完成它...... :-)

谢谢

4

2 回答 2

2

我不知道 plugin.url_for() 是做什么的,但你应该可以通过这种方式加快它的速度:

plugin_url_for = plugin.url_for
_, dirs, _ = iter(os.walk(PATH_TO_DIRECTORY)).next()
items = [{
     'label': directory, 'path': plugin_url_for('test')
} for directory in dirs]

我删除了 root,文件变量,因为您似乎没有使用它,也删除了 dirs 上的枚举,因为您没有使用它。但是,如果您出于某种奇怪的原因需要它,请将其放回原处。请测试它,如果它有帮助,请告诉我。由于显而易见的原因,我自己无法正确测试它。

于 2013-08-04T21:12:09.440 回答
0
dirlist = []
for root, dirs, files in os.walk(PATH_TO_DIRECTORY):
    dirlist += dirs

应该做的伎俩!

对于您修改后的问题,我认为您真正需要的可能是以下输出:

Dirdict = {}
for (root, dirs, files) in os.walk (START):
    Dirdict [root] = dirs

您可能希望或需要使用 plugin_url(root) 对 root 进行一些编码,这将为您提供一个字典,您可以在其中查找 plugin_url(some_path) 并获取该路径中所有目录的列表。你正在做的是用一个键创建一个字典列表。我怀疑您可能会在 python 2.7 中的集合中使用 namedtupple 并作为 python 3 中的内置函数。

于 2013-08-04T19:44:34.630 回答