You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 02:48:32