使用os.walk添加到列表

时间:2013-08-04 19:35:38

标签: python python-2.7 xbmc

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

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中添加“items”列表,如下所示

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

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

os.walk的每一个例子我都可以在网上找到简单的print目录或文件,这可以作为其使用的一个例子 - 但在现实世界中并不是很有用。

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

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

由于

2 个答案:

答案 0 :(得分: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上的枚举,因为你没有使用它。但是,如果你出于某些奇怪的原因需要它,请把它放回去。 请测试一下,如果有帮助请告诉我。我出于显而易见的原因无法正确测试它。

答案 1 :(得分: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中作为内置函数。