在R中如何获取文件夹中的文件列表,而不是目录中的文件列表?
我尝试使用不同选项的dir()
,list.files()
,list.dirs()
,
但它们似乎都不起作用。
答案 0 :(得分:18)
setdiff(list.files(), list.dirs(recursive = FALSE, full.names = FALSE))
会做到这一点。
答案 1 :(得分:8)
这是一种可能性:
all.files <- list.files(rec=F)
all.files[!file.info(all.files)$isdir]
另一种选择(具有扩展名的文件的模式,当然不是那么普遍):
Sys.glob("*.*")
答案 2 :(得分:2)
另一种选择:
Filter(function(x) file_test("-f", x), list.files())
如果您希望使用库functional
完全正常运行,那么您可以节省一些按键:
Filter(Curry(file_test, "-f"), list.files())
后者将file_test
转换为第一个参数设置为“-f”的函数,这基本上就是我们在第一种方法中所做的,但是Curry
更干净,因为它让function
关键字过长的可悲决定(为什么不f(x) {...}
???)
答案 3 :(得分:1)
所以,我知道这些都是陈旧的,并且有一个接受的答案,但我尝试了大部分,但没有一个真的有效。
这是我得到的:
文件夹中所有文件的示例:
files <- list.files("Training/Out/")
该代码的输出:
[1] "Filtered" "Training_Chr01.txt" "Training_Chr02.txt" "Training_Chr03.txt"
[5] "Training_Chr04.txt" "Training_Chr05.txt" "Training_Chr06.txt" "Training_Chr07.txt"
[9] "Training_Chr08.txt" "Training_Chr09.txt" "Training_Chr10.txt"
第一个[1]是目录
将此代码保留为仅获取文件:
files <- list.files("Training/Out",recursive = TRUE)
使用此输出:
[1] "Training_Chr01.txt" "Training_Chr02.txt" "Training_Chr03.txt" "Training_Chr04.txt"
[5] "Training_Chr05.txt" "Training_Chr06.txt" "Training_Chr07.txt" "Training_Chr08.txt"
[9] "Training_Chr09.txt" "Training_Chr10.txt"
这或多或少可以帮助那些看着这个并且和我一样困惑的人。
答案 4 :(得分:0)
基R没有直接的方法来执行此操作的事实令人震惊。 BASH没有直接方法的事实也有点奇怪。
我认为,最好的R解决方案是简单地吸引shell:
Object.assign({}, state, { jwt: action.jwt });
说明:
filenames = system('ls -p | grep -v /', intern=T)
答案 5 :(得分:0)
我写了一个小包装函数来解决这个问题:
list_files <- function(path = ".", pattern = NULL, all.files = FALSE, full.names = TRUE,
recursive = FALSE, ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE,
incl_dirs = FALSE){
#Set incl_dirs = TRUE to revert to default list.files() behavior.
if(path == ".") { path = getwd() }
#Include directories if recursive is set.
if(incl_dirs & recursive) { include.dirs = TRUE }
#Needs to have full.names = TRUE in order to get full path to pass to dir.exists().
files <- list.files(path = path, pattern = pattern, all.files = all.files, full.names = TRUE,
recursive = recursive, ignore.case = ignore.case, include.dirs = include.dirs,
no.. = no..)
if(!incl_dirs){
files <- files[!dir.exists(files)]
}
if(!full.names){
return(basename(files))
} else{
return(files)
}
}
使用以下示例目录结构:
dir_test_lvl0/
├── dir_test_lvl1
│ ├── dir_test_lvl2
│ │ ├── dir_test_lvl3
│ │ │ ├── dir_test_lvl4
│ │ │ └── file_test_lvl4
│ │ └── file_test_lvl3
│ └── file_test_lvl2
└── file_test_lvl1
输出将如下所示,具体取决于 incl_dirs
和 recursive
是否已设置(或未设置)。
#No directories presented.
#Recursive.
list_files("dir_test_lvl0", incl_dirs = FALSE, recursive = TRUE, full.names = FALSE)
# [1] "file_test_lvl4" "file_test_lvl3" "file_test_lvl2" "file_test_lvl1"
#No directories presented.
#Non-Recursive.
list_files("dir_test_lvl0", incl_dirs = FALSE, recursive = FALSE, full.names = FALSE)
# [1] "file_test_lvl1"
#With directories presented (default list.files() behavior).
#Non-recursive.
list_files("dir_test_lvl0", incl_dirs = TRUE, recursive = FALSE, full.names = FALSE)
# [1] "dir_test_lvl1" "file_test_lvl1"
#With directories presented (default list.files() behavior).
#Recursive.
list_files("dir_test_lvl0", incl_dirs = TRUE, recursive = TRUE, full.names = FALSE)
# [1] "dir_test_lvl1" "dir_test_lvl2" "dir_test_lvl3" "dir_test_lvl4" "file_test_lvl4"
# [6] "file_test_lvl3" "file_test_lvl2" "file_test_lvl1"
所有其他 list.files()
选项都由 list_files()
忠实地传递给它。该函数没有外部依赖项(仅限 base R
)。