【发布时间】:2011-12-08 09:44:57
【问题描述】:
如何提取给定文件路径的文件扩展名作为字符?我知道我可以通过正则表达式 regexpr("\\.([[:alnum:]]+)$", x) 做到这一点,但想知道是否有内置函数来处理这个问题?
【问题讨论】:
标签: r file-extension built-in
如何提取给定文件路径的文件扩展名作为字符?我知道我可以通过正则表达式 regexpr("\\.([[:alnum:]]+)$", x) 做到这一点,但想知道是否有内置函数来处理这个问题?
【问题讨论】:
标签: r file-extension built-in
这是用 R 基本工具很容易找到的东西。例如:??路径。
无论如何,加载tools 包并阅读?file_ext。
【讨论】:
??"extensions" 中,尽管人们会预料到它会出现。
sos 进行全文搜索。 ?? 仅搜索元数据(标题、关键字等)。此外,浏览结果并不难。 (我试过findFn("{file extension}")、"extract {file extension}"和"{extract file extension}",第一个最好。)
让我从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'。
【讨论】:
tools::file_ext时不要使用library(tools),例如在tools::file_ext("test.txt")中。
没有要加载的包的简单功能:
getExtension <- function(file){
ex <- strsplit(basename(file), split="\\.")[[1]]
return(ex[-1])
}
【讨论】:
如果扩展名包含非 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
}
【讨论】:
basename 和dirname 省去了这里的一些工作
这个函数使用管道:
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函数
tools::file_ext 工作正常。
tools::file_ext(fileName)
paste0(".", tools::file_ext(fileName))
【讨论】:
如果你不想使用任何额外的包,你可以尝试
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] ""
【讨论】: