从树形结构中打开所有基础文件

时间:2018-10-16 10:26:39

标签: python glob

我有很多要合并为一个文件的html文件。 文件路径是/ Desktop / Username / My_files /。此文件夹包含1300个不同的文件夹,并且所有这些文件夹都具有message.html文件。

我不想用一个一个地复制它们,而是想使用Python解决这个问题。 如果message.html在文件夹中,但是无法读取基础文件夹结构的内容,我的代码将起作用。代码的粗体部分需要更改,但是如何最容易地纠正呢?

/settings

1 个答案:

答案 0 :(得分:0)

如果所有文件都只是一个文件夹级别的深度,则您只是放错了占位符。对未知文件夹使用占位符,而不是文件名:

# match "message.html" in all direct subfolders of "/Home/Username/Desktop/My_files/"
path = '/Home/Username/Desktop/My_files/*/message.html'

请注意,如果文件名也不是常量,glob也将占用几个占位符:

# match any html file in all direct subfolders of "/Home/Username/Desktop/My_files/"
path = '/Home/Username/Desktop/My_files/*/*.html'

如果不仅需要直接子文件夹,那么事情会更加棘手。从Python3.5开始,glob.glob supports a recursive placeholder

  

如果递归为true,则模式“ **”将匹配任何文件以及零个或多个目录和子目录。

在您的情况下,看起来像这样:

# match "message.html" in all subfolders of "/Home/Username/Desktop/My_files/"
path = '/Home/Username/Desktop/My_files/**/message.html'
files = glob.glob(path, recursive=True)

在较旧的Python版本上,您应该自己遍历目录。 os.walk function允许您递归检查子目录中的所有文件。

以下内容提供了基本目录中具有固定名称的每个文件的完整路径:

def find_files(base_path, file_name):
    """Yield all paths to any file named ``file_name`` in a subdirectory of ``base_path``"""
    # recursively walk through all subdirectories
    for dirpath, dirnames, filenames in os.walk(base_path):
        # test if the file name occurs in the current subdirectory
        if file_name in filenames:
            yield os.path.join(base_path, dirpath, file_name)

您可以使用它代替全局结果:

files = find_files('/Home/Username/Desktop/My_files/', 'message.html')
for file in files:
   ...