Use fnmatch.filter to filter files by more than one possible file extension

后端 未结 8 1801
面向向阳花
面向向阳花 2021-01-31 02:52

Given the following piece of python code:

for root, dirs, files in os.walk(directory):
    for filename in fnmatch.filter(files, \'*.png\'):
        pass
         


        
8条回答
  •  被撕碎了的回忆
    2021-01-31 03:16

    I've been using this with a lot of success.

    import fnmatch
    import functools
    import itertools
    import os
    
    # Remove the annotations if you're not on Python3
    def find_files(dir_path: str=None, patterns: [str]=None) -> [str]:
        """
        Returns a generator yielding files matching the given patterns
        :type dir_path: str
        :type patterns: [str]
        :rtype : [str]
        :param dir_path: Directory to search for files/directories under. Defaults to current dir.
        :param patterns: Patterns of files to search for. Defaults to ["*"]. Example: ["*.json", "*.xml"]
        """
        path = dir_path or "."
        path_patterns = patterns or ["*"]
    
        for root_dir, dir_names, file_names in os.walk(path):
            filter_partial = functools.partial(fnmatch.filter, file_names)
    
            for file_name in itertools.chain(*map(filter_partial, path_patterns)):
                yield os.path.join(root_dir, file_name)
    

    Examples:

    for f in find_files(test_directory):
        print(f)
    

    yields:

    .\test.json
    .\test.xml
    .\test.ini
    .\test_helpers.py
    .\__init__.py
    

    Testing with multiple patterns:

    for f in find_files(test_directory, ["*.xml", "*.json", "*.ini"]):
        print(f)
    

    yields:

    .\test.json
    .\test.xml
    .\test.ini
    

提交回复
热议问题