30

我正在尝试获取与完整路径模式匹配的文件列表。到目前为止,我已经使用了 list.files() 但它没有用。

假设我们有以下目录组织:

results
   |- A
   |  |- data-1.csv
   |  |- data-2.csv
   |
   |- B
      |- data-1.csv
      |- data-2.csv

然后是以下命令:

list.files(pattern='data-.*\\.csv', recursive=TRUE)

将返回与模式匹配的所有文件。这可行,但是在使用完整路径模式时会出现问题。例如,如果我想从目录results/A获取所有 CSV 文件,我可以这样做:

list.files(pattern='results/A/data-.*\\.csv', recursive=TRUE)

但是,这不起作用。不知何故,R 似乎无法将完整路径模式用作正则表达式。在这种情况下,解决方案可能是只使用results/A作为基本路径。但在更复杂的问题中,这是无法做到的。例如,在某些时候我们可能想要匹配仅包含字符的子目录:

list.files(pattern='results/[A-Z]+/data-.*\\.csv', recursive=TRUE)

可以在R中做到这一点吗?

更新:使用临时解决方案一段时间后,我决定停止一次又一次地输入相同的内容。因此,我创建了一个来简化此任务。

4

4 回答 4

37

首先,请注意您没有使用正则表达式模式。你的第一个例子应该是:

list.files(pattern='data-.*\\.csv', recursive=TRUE)

然后,内部的模式匹配似乎list.files 应用于文件基名(即,不包括目录路径),因此您可以将任务拆分为:

  1. 仅查找与基本名称匹配的所有文件,返回它们的完整路径:

    basename.matches <- list.files(pattern='data-.*\\.csv', recursive=TRUE,
                                   full.names = TRUE)
    basename.matches
    # [1] "./results/A/data-1.csv" "./results/A/data-2.csv" "./results/B/data-1.csv"
    # [4] "./results/B/data-2.csv"
    
  2. 仅保留与预期目录匹配的那些:

    full.matches <- grep(pattern='^\\./results/A/', basename.matches, value = TRUE)
    full.matches
    # [1] "./results/A/data-1.csv" "./results/A/data-2.csv"
    
于 2012-04-27T15:56:50.473 回答
7

您不能只这样做,list.files因为它会遍历其中的每个元素path并将正则表达式应用于其中包含的文件。但是由于path参数 tolist.files可以接受一个向量,你可以用它来解决你的问题。

dirs <- grep("[A-Z]+$",list.dirs("results",recursive=FALSE),value=TRUE)
list.files(dirs, "data-.*\\.csv", recursive=TRUE, full.names=TRUE)
于 2012-04-27T16:08:30.833 回答
1

我认为有一个更简单的解决方案:

Sys.glob(file.path(results, "[A-Z]", "data-*.csv"))

于 2015-06-17T19:24:31.073 回答
0

我会用

paths <- list.files(results, pattern= glob2rx("*data-*.csv$*"), full.names=T, recursive=T)
于 2018-02-28T16:41:32.017 回答