【问题标题】:pathlib.Path().glob() and multiple file extensionpathlib.Path().glob() 和多个文件扩展名
【发布时间】:2018-05-19 04:59:13
【问题描述】:

我需要指定多个文件扩展名,例如pathlib.Path(temp_folder).glob('*.xls', '*.txt'):

我该怎么做?

https://docs.python.org/dev/library/pathlib.html#pathlib.Path.glob

【问题讨论】:

    标签: python path


    【解决方案1】:

    有点晚了,有几个单行建议不需要编写自定义函数,也不需要使用循环并在 Linux 上工作:

    pathlib.Path.glob() 采用括号中的交错符号。对于“.txt”和“.xls”后缀的情况,可以这样写

    files = pathlib.Path('temp_dir').glob('*.[tx][xl][ts]')
    

    如果您还需要搜索“.xlsx”,只需在最后一个右括号后附加通配符“*”即可。

    files = pathlib.Path('temp_dir').glob('*.[tx][xl][ts]*')
    

    要记住的是,末尾的通配符不仅会捕获“x”,还会捕获最后一个“t”或“s”之后的任何尾随字符。

    在搜索模式前加上“**/”将执行递归搜索,如之前的答案中所述。

    【讨论】:

    • 单线解决方案的一个警告是,这也将匹配扩展名为 .txs、.tlt、.tls、.xxs 和 .xlt 的文件。
    【解决方案2】:

    假设准备了以下文件夹结构。

    folder
    ├── test1.png
    ├── test1.txt
    ├── test1.xls
    ├── test2.png
    ├── test2.txt
    └── test2.xls
    

    使用pathlib.Path的简单答案如下。

    from pathlib import Path
    
    ext = ['.txt', '.xls']
    folder = Path('./folder')
    
    # Get a list of pathlib.PosixPath
    path_list = sorted(filter(lambda path: path.suffix in ext, folder.glob('*')))
    print(path_list)
    # [PosixPath('folder/test1.txt'), PosixPath('folder/test1.xls'), PosixPath('folder/test2.txt'), PosixPath('folder/test2.xls')]
    

    如果你想将路径作为字符串列表获取,可以使用.as_posix()将其转换为字符串。

    # Get a list of string paths
    path_list = sorted([path.as_posix() for path in filter(lambda path: path.suffix in ext, folder.glob('*'))])
    print(path_list)
    # ['folder/test1.txt', 'folder/test1.xls', 'folder/test2.txt', 'folder/test2.xls']
    

    【讨论】:

      【解决方案3】:

      您还可以使用pathlib 中的语法**,它允许您递归地收集嵌套路径。

      from pathlib import Path
      import re
      
      
      BASE_DIR = Path('.')
      EXTENSIONS = {'.xls', '.txt'}
      
      for path in BASE_DIR.glob(r'**/*'):
          if path.suffix in EXTENSIONS:
              print(path)
      

      如果您想在搜索中表达更多逻辑,您还可以使用正则表达式,如下所示:

      pattern_sample = re.compile(r'/(([^/]+/)+)(S(\d+)_\d+).(tif|JPG)')
      

      在我的情况下,此模式将查找与 S327_008(_flipped)?.tif 匹配的所有图像(tif 和 JPG)。具体来说,它会收集样本 id 和文件名。

      收集到一个集合可以防止存储重复,我发现如果您插入更多逻辑并希望忽略不同版本的文件,它有时很有用 (_flipped)

      matched_images = set()
      
      for item in BASE_DIR.glob(r'**/*'):
          match = re.match(pattern=pattern_sample, string=str(item))
          if match:
              # retrieve the groups of interest
              filename, sample_id = match.group(3, 4)
              matched_images.add((filename, int(sample_id)))
      

      【讨论】:

      • 我更喜欢这个,因为您只需遍历目录树一次,而不是 n * len(extensions)。感谢您发布此内容。
      【解决方案4】:

      基于Check if string ends with one of the strings from a list的四线解决方案:

      folder = '.'
      suffixes = ('xls', 'txt')
      filter_function = lambda x: x.endswith(suffixes)
      list(filter(filter_function, glob(os.path.join(folder, '*'))))
      

      【讨论】:

        【解决方案5】:

        如果需要使用 pathlib.Path.glob()

        from pathlib import Path
        def get_files(extensions):
            all_files = []
            for ext in extensions:
                all_files.extend(Path('.').glob(ext))
            return all_files
        
        files = get_files(('*.txt', '*.py', '*.cfg'))
        

        【讨论】:

        • 这将直接在当前目录中获取文件,而不是在任何给定目录中。
        • @Boris 它回答了这个问题
        • @Boris 只需将 Path('.') 更改为 Path(temp_folder)
        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 2015-01-12
        • 2021-07-18
        • 1970-01-01
        • 2012-09-08
        • 1970-01-01
        • 1970-01-01
        • 2019-07-30
        相关资源
        最近更新 更多