【发布时间】:2018-05-19 04:59:13
【问题描述】:
我需要指定多个文件扩展名,例如pathlib.Path(temp_folder).glob('*.xls', '*.txt'):
我该怎么做?
https://docs.python.org/dev/library/pathlib.html#pathlib.Path.glob
【问题讨论】:
我需要指定多个文件扩展名,例如pathlib.Path(temp_folder).glob('*.xls', '*.txt'):
我该怎么做?
https://docs.python.org/dev/library/pathlib.html#pathlib.Path.glob
【问题讨论】:
有点晚了,有几个单行建议不需要编写自定义函数,也不需要使用循环并在 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”之后的任何尾随字符。
在搜索模式前加上“**/”将执行递归搜索,如之前的答案中所述。
【讨论】:
假设准备了以下文件夹结构。
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']
【讨论】:
您还可以使用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)))
【讨论】:
基于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, '*'))))
【讨论】:
如果需要使用 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'))
【讨论】:
Path('.') 更改为 Path(temp_folder)