R语言如何设置list.files仅遍历指定子目录提取txt文件
实现方法
现有代码从根目录全量递归会扫描所有无关子文件夹,返回冗余结果,可通过「先定位目标文件夹、再定向检索文件」的两步法优化,完全匹配目录结构需求:
问题场景
目标目录结构如下:
main |____ A1 | |__proj_doc | |__ some txt files |____ B2 | |__proj_doc | |__ some txt files |____ C3 |__proj doc |__ tmp | |__ some txt files | |__ some txt files
需要提取所有proj_doc、proj doc文件夹(含其子目录,比如C3路径下的tmp文件夹)内的txt文件,原有全量递归代码会返回main下所有层级的txt,冗余度高。原有代码如下:
mylist <-list.files(path = "/main", recursive = TRUE, pattern = "\\.txt$", full.names = TRUE)
可直接运行的代码
优先推荐用list.dirs()做目录匹配,逻辑清晰、不容易因为正则匹配出错:
# 1. 先获取main下所有子目录的完整路径 all_subdirs <- list.dirs("/main", recursive = TRUE, full.names = TRUE) # 2. 精确筛选出目录名恰好是proj_doc或proj doc的目标路径 target_dirs <- all_subdirs[basename(all_subdirs) %in% c("proj_doc", "proj doc")] # 3. 遍历每个目标目录,检索其下所有txt文件(自动包含子目录内的txt,比如tmp下的文件) mylist <- unlist(lapply(target_dirs, function(dir) { list.files( path = dir, pattern = "\\.txt$", recursive = TRUE, full.names = TRUE ) }))
如果需要兼容R 3.x旧版本,可以用list.files()加目录判断实现第一步的目标文件夹定位:
all_matches <- list.files( path = "/main", pattern = "^proj(_doc| doc)$", recursive = TRUE, full.names = TRUE ) # 过滤掉同名文件,只保留目录 target_dirs <- all_matches[file.info(all_matches)$isdir] # 后续检索txt的代码和上面完全一致 mylist <- unlist(lapply(target_dirs, function(dir) { list.files(path = dir, pattern = "\\.txt$", recursive = TRUE, full.names = TRUE) }))
效果说明
- 不会扫描main下A1、B2、C3目录里非目标文件夹的内容,遍历效率比全根目录递归高很多
- 自动覆盖
proj doc下tmp子目录内的txt文件,完全匹配需求 - 不会返回不在目标文件夹下的无关txt文件,无冗余结果
内容的提问来源于stack exchange,提问作者Haribo
相关产品推荐
相关产品推荐

