【问题标题】:Extract file extension from file path从文件路径中提取文件扩展名
【发布时间】:2011-12-08 09:44:57
【问题描述】:

如何提取给定文件路径的文件扩展名作为字符?我知道我可以通过正则表达式 regexpr("\\.([[:alnum:]]+)$", x) 做到这一点,但想知道是否有内置函数来处理这个问题?

【问题讨论】:

    标签: r file-extension built-in


    【解决方案1】:

    这是用 R 基本工具很容易找到的东西。例如:??路径。

    无论如何,加载tools 包并阅读?file_ext

    【讨论】:

    • 它不会出现在??"extensions" 中,尽管人们会预料到它会出现。
    • @DWin:“耐心,蚱蜢”:-)。我也会推荐 package:sos 。这很酷。
    • Witthof:让我对两个帐户感到困惑; pkg:sos 如何解决缺少 tools::fiie_ext 与 ??() 的问题,而一个理性的人会期望它;并且肯定需要耐心从提供 20 个页面和 400 次点击的搜索策略中获取价值?
    • sos 进行全文搜索。 ?? 仅搜索元数据(标题、关键字等)。此外,浏览结果并不难。 (我试过findFn("{file extension}")"extract {file extension}""{extract file extension}",第一个最好。)
    • 这对于实际的代码示例会更有用
    【解决方案2】:

    让我从https://stackoverflow.com/users/680068/zx8754扩展一点很棒的答案

    这里是简单的代码sn-p

      # 1. Load library 'tools'
      library("tools")
    
      # 2. Get extension for file 'test.txt'
      file_ext("test.txt")
    

    结果应该是'txt'。

    【讨论】:

    • 请向上滚动并阅读此问题的已接受答案。
    • 谢谢你,里奇!我阅读了这条评论并添加了这段代码,只是为了展示它在简单代码 sn-p 中的外观。也许它会对某人有所帮助。
    • 其他评论可能已被首先接受,但很高兴看到解决方案写出来。接受的答案只是告诉您在哪里找到答案。这实际上回答了这个问题。
    • 当你可以简单地使用tools::file_ext时不要使用library(tools),例如在tools::file_ext("test.txt")中。
    【解决方案3】:

    没有要加载的包的简单功能:

    getExtension <- function(file){ 
        ex <- strsplit(basename(file), split="\\.")[[1]]
        return(ex[-1])
    } 
    

    【讨论】:

      【解决方案4】:

      如果扩展名包含非 alnum,上面的正则表达式会失败(参见例如https://en.wikipedia.org/wiki/List_of_filename_extensions) 作为一种替代方法,可以使用以下功能:

      getFileNameExtension <- function (fn) {
      # remove a path
      splitted    <- strsplit(x=fn, split='/')[[1]]   
      # or use .Platform$file.sep in stead of '/'
      fn          <- splitted [length(splitted)]
      ext         <- ''
      splitted    <- strsplit(x=fn, split='\\.')[[1]]
      l           <-length (splitted)
      if (l > 1 && sum(splitted[1:(l-1)] != ''))  ext <-splitted [l] 
      # the extention must be the suffix of a non-empty name    
      ext
      

      }

      【讨论】:

      • 函数basenamedirname 省去了这里的一些工作
      • @Pisca46:我想在 R 包中使用这样的函数。你写的函数?如果没有,您可以在答案中添加参考吗?
      • 是的,函数是我自己写的。
      【解决方案5】:

      这个函数使用管道:

      library(magrittr)
      
      file_ext <- function(f_name) {
        f_name %>%
          strsplit(".", fixed = TRUE) %>%
          unlist %>%
          extract(2)
       }
      
       file_ext("test.txt")
       # [1] "txt"
      

      【讨论】:

      • 你能评论一下这是对tools::file_ext的改进吗?
      • 你最好使用tools函数
      • 如果文件的文件名中包含点,则建议的函数将无法正常工作。该函数拆分文件名并输出第二个元素,而它应该输出最后一个元素。对于以下文件名“file.name.txt”,输出是“name”,而不是“txt”。 tools::file_ext 工作正常。
      【解决方案6】:

      只提取不带点的文件扩展名:

      tools::file_ext(fileName)

      用点提取文件扩展名:

      paste0(".", tools::file_ext(fileName))

      【讨论】:

        【解决方案7】:

        如果你不想使用任何额外的包,你可以尝试

        file_extension <- function(filenames) {
            sub(pattern = "^(.*\\.|[^.]+)(?=[^.]*)", replacement = "", filenames, perl = TRUE)
            }
        

        如果您喜欢神秘,可以尝试将其用作单行表达式:sub("^(.*\\.|[^.]+)(?=[^.]*)", "", filenames, perl = TRUE) ;-)

        它适用于零个 (!)、一个或多个带有任意数量点的文件名(作为字符向量或列表).,也适用于没有任何扩展名的文件名,它返回空字符 "" .

        这是我尝试过的测试:

        > file_extension("simple.txt")
        [1] "txt"
        > file_extension(c("no extension", "simple.ext1", "with.two.ext2", "some.awkward.file.name.with.a.final.dot.", "..", ".", ""))
        [1] ""     "ext1" "ext2" ""     ""     ""     ""    
        > file_extension(list("file.ext1", "one.more.file.ext2"))
        [1] "ext1" "ext2"
        > file_extension(NULL)
        character(0)
        > file_extension(c())
        character(0)
        > file_extension(list())
        character(0)
        

        顺便说一句,tools::file_ext() 很难找到带有非字母数字字符的“奇怪”扩展:

        > tools::file_ext("file.zi_")
        [1] ""
        

        【讨论】:

          猜你喜欢
          • 2012-10-06
          • 1970-01-01
          • 1970-01-01
          • 2012-10-11
          • 2011-03-10
          • 2022-06-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多