PHP如何扫描目录筛选文件名在20.jpg到40.jpg之间的文件?
如何用scandir只筛选20.jpg到40.jpg之间的文件
当然有简便的方法啦!虽然scandir本身没有内置的范围筛选参数,但我们可以在获取目录内容的同时,直接加入过滤逻辑,不用先拿到所有文件再二次处理,效率也很高。
下面分两种常见语言给你示例:
PHP 实现
我们可以把文件判断和范围筛选合并到一个回调里,减少遍历次数:
$dir = '/path/to/your/target-dir'; $targetFiles = array_filter(scandir($dir), function($item) use ($dir) { // 先排除.、..和目录项 if ($item === '.' || $item === '..' || !is_file($dir . DIRECTORY_SEPARATOR . $item)) { return false; } // 匹配以数字开头、.jpg结尾的文件名 preg_match('/^(\d+)\.jpg$/', $item, $matches); // 判断数字是否在20-40之间 return isset($matches[1]) && ((int)$matches[1] >= 20 && (int)$matches[1] <= 40); }); // 输出结果 print_r($targetFiles);
Python 实现
Python的scandir(3.5+自带,也可以用os.scandir)可以直接遍历目录条目,边遍历边筛选:
import os dir_path = '/path/to/your/target-dir' target_files = [] for entry in os.scandir(dir_path): if entry.is_file(): filename = entry.name # 先确认是jpg文件 if filename.endswith('.jpg'): # 提取文件名里的数字部分 try: file_num = int(filename.split('.')[0]) # 判断范围 if 20 <= file_num <= 40: target_files.append(filename) except ValueError: # 文件名不是纯数字开头的话跳过 continue print(target_files)
小提示
- 两种实现都是一次遍历完成所有筛选,比先获取全量文件再过滤更高效,尤其是目录文件很多的时候。
- 正则/字符串分割的方式能精准匹配你要的文件名格式,避免把比如
120.jpg或者abc25.jpg这类不符合规则的文件误选进来。
内容的提问来源于stack exchange,提问作者user9697902
相关产品推荐
相关产品推荐

