【问题标题】:Listing all files matching a full-path pattern in R列出与 R 中的完整路径模式匹配的所有文件
【发布时间】:2012-05-08 08:57:42
【问题描述】:

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

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

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

然后是下面的命令:

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

将返回所有匹配模式的文件。这可行,但使用 full-path 模式时会出现问题。例如,如果我想从目录 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 中可以做到这一点吗?

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

【问题讨论】:

    标签: regex r path


    【解决方案1】:

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

    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"
      

    【讨论】:

    • 你完全正确。感谢您发现这一点。您的两步解决方案类似于我计划做的事情,如果看起来确实如此,R 中不支持完整路径模式。但是,如果正则表达式指向绝对路径,请列出。文件将不起作用。例如,'/tmp/[A-Z]+/data-.*\\.csv'。我想我总是可以提取路径'/tmp/'的开头并将其用作list.files的'path'参数,但我想知道R是否已经提供了类似的东西。
    【解决方案2】:

    您不能仅使用 list.files 执行此操作,因为它会遍历 path 中的每个元素并将正则表达式应用于其中包含的文件。但由于 list.filespath 参数可以接受向量,因此您可以使用它来解决您的问题。

    dirs <- grep("[A-Z]+$",list.dirs("results",recursive=FALSE),value=TRUE)
    list.files(dirs, "data-.*\\.csv", recursive=TRUE, full.names=TRUE)
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我会用

        paths <- list.files(results, pattern= glob2rx("*data-*.csv$*"), full.names=T, recursive=T)
        

        【讨论】:

          猜你喜欢
          • 2010-12-11
          • 2015-10-13
          • 1970-01-01
          • 2012-01-21
          • 1970-01-01
          • 2018-11-15
          • 1970-01-01
          • 2012-09-19
          相关资源
          最近更新 更多