0

我有一个类似于以下的目录结构:

Dir1
Dir2
Dir3
Dir4
    L SubDir4.1
    L SubDir4.2
    L SubDir4.3

我想生成一个文件列表(带有完整路径),其中包含 的所有内容Dirs1-3,但仅限SubDir4.2Dir4. 我到目前为止的代码是

import fnmatch
import os

for root, dirs, files in os.walk( '.' )
    if 'Dir4' in dirs:
        if not 'SubDir4.2' in 'Dir4':
            dirs.remove( 'Dir4' )
    for file in files
        print os.path.join( root, file )

我的问题是,我尝试排除SubDir4.2路径中没有的任何文件的部分是排除 中的所有内容Dir4,包括我想保留的内容。我应该如何修改上面的内容来做我想做的事?

更新 1:我应该补充一点,下面有很多目录,Dir4因此手动将它们列在排除列表中并不是一个实际的选择。我希望能够指定为要读取SubDur4.2的唯一子目录。Dir4

更新 2:由于我无法控制的原因,我只能访问 Python 2.4.3 版。

4

3 回答 3

1

您的代码段中有一些错别字。我提出这个:

import os

def any_p(iterable):
    for element in iterable:
        if element:
            return True
    return False

include_dirs = ['Dir4/SubDir4.2', 'Dir1/SubDir4.2', 'Dir3', 'Dir2'] # List all your included folder names in that


for root, dirs, files in os.walk( '.' ):
    dirs[:] = [d for d in dirs if any_p(d in os.path.join(root, q_inc) for q_inc in include_dirs)]

    for file in files:
        print file

编辑:根据评论,我已经改变了,所以这是包含列表,而不是排除列表。

EDIT2:添加了一个 any_p(python 版本 < 2.5 的 any() 等效函数)

EDIT3bis:如果您在其他文件夹中有其他具有相同名称“SubDir4.2”的子文件夹,您可以使用以下命令指定位置:

include_dirs = ['Dir4/SubDir4.2', 'Dir1/SubDir4.2']

假设你有一个 Dir1/SubDir4.2。

如果它们很多,那么您可能希望使用 fnmatch 或正则表达式查询来改进这种方法。

于 2012-07-16T12:07:54.607 回答
0

我更改了 mstud 的解决方案,为您提供所需的内容:

import os;

for root, dirs, files in os.walk('.'):
    # Split the root into its path parts
    tmp = root.split(os.path.sep)
    # If the lenth of the path is long enough to be your path AND
    # The second to last part of the path is Dir4 AND
    # The last part of the path is SubDir4.2 THEN
    # Stop processing this pass.
    if (len(tmp) > 2) and (tmp[-2] == 'Dir4') and (tmp[-1] != 'SubDir4.2'):
        continue
    # If we aren't in Dir4, print the file paths.
    if tmp[-1] != 'Dir4':
        for file in files:
            print os.path.join(root, file)

简而言之,第一个“if”跳过了 Dir4 下不是 SubDir4.2 的任何目录内容的打印。第二个“if”跳过 Dir4 目录内容的打印。

于 2012-07-16T13:42:39.240 回答
-1
for root, dirs, files in os.walk('.'):
    tmp = root.split(os.path.sep)
    if len(tmp)>2 and tmp[-2]=="Dir4" and tmp[-1]=="SubDir4.2":
        continue

    for file in files:
        print os.path.join(root, file)
于 2012-07-16T11:59:39.517 回答