非C驱动器目录上的os.walk

时间:2014-01-17 01:49:40

标签: python subdirectory os.walk

我知道有几个帖子涉及到这个,但我还没有找到一个适合我的帖子。我需要通过搜索整个映射目录来创建扩展名为.mxd的文件列表。我使用了这段代码并且有效:

    import os
    file_list = []
    for (paths, dirs, files) in os.walk(folder):
        for file in files:
            if file.endswith(".mxd"):
                file_list.append(os.path.join(paths, file))

但是,它仅适用于C盘。我需要能够在我选择的映射驱动器上搜索这些文件。这是我正在使用的脚本,但它不起作用。我知道此驱动器的子目录中有一个mxd文件,但它没有在文件列表中报告。实际上,文件列表完全是空的,它不应该是。

    import os
    path = r"U:/TEST/"
    filenamelist = []
    for files in os.walk(path):
         if file.endswith(".mxd"):
            filenamelist.append(files)

是否有人在我的第二个代码块中看到任何错误,这些代码块会通过给定路径上的子目录进行迭代并报告带有.mxd扩展名的文件?

3 个答案:

答案 0 :(得分:1)

os.walk(path)产生一个3元组,通常将其解压缩为root, dirs, files。而不是

for files in os.walk(path):
    ...

使用

for root, dirs, files in os.walk(path):
    for filename in files:
        if filename.endswith(".mxd"):
            filenamelist.append(filename)

答案 1 :(得分:1)

  

是否有人在我的第二个代码块中看到任何错误,这些代码块会通过给定路径上的子目录进行迭代并报告带有.mxd扩展名的文件?

是。比较和对比你的两个循环:

for (paths, dirs, files) in os.walk(folder):
    for file in files:
        if file.endswith(".mxd"):
            file_list.append(os.path.join(paths, file))

for files in os.walk(path):
     if file.endswith(".mxd"):
        filenamelist.append(files)

您尝试做同样的事情,但不要使用相同的代码。

在第一个中,您循环遍历walk,将每个元组存储在(paths, dirs, files)中,然后循环遍历files

在第二个中,你循环遍历walk,将每个元组存储在files中,不要循环任何东西,然后只使用一个名为file的变量来自一些早期的代码。

然后,即使该部分有效,您最终会追加files(记住,这是三个列表的元组)而不是file - 或者,可能更好,{{1} - 列表。

让第二个看起来像第一个。或者,更好的是,将它放在一个函数中并调用它两次,而不是复制和粘贴它。

答案 2 :(得分:0)

这是用于在除C之外的驱动器根上进行爬网的最终脚本:

import os
file_list = []
path = r'U:\\'
for (dirpath, subdirs, files) in os.walk(path):
    for file in files:
        if file.endswith(".mxd"):
            file_list.append(os.path.join(dirpath, file))