在 R 中获取不带扩展名的文件名

Get filename without extension in R

提问人:Matrix.cursor 提问时间:3/18/2015 最后编辑:AndrewGBMatrix.cursor 更新时间:5/24/2022 访问量:92207

问:

我有一个文件:

ABCD.csv 

前面的长度不是固定的,任何长度都不同。.csv

我怎样才能提取之前的部分?.csv

R-常见问题

评论


答:

29赞 akrun 3/18/2015 #1

您可以使用 或subsubstr

sub('\\.csv$', '', str1) 
#[1] "ABCD"

substr(str1, 1, nchar(str1)-4)
#[1] "ABCD"

使用@JasonV帖子中的“file_path”

sub('\\..*$', '', basename(filepath))
#[1] "ABCD"

library(stringr)
str_extract(filepath,  perl('(?<=[/])([^/]+)(?=\\.[^.]+)'))
#[1] "ABCD"

数据

str1 <- 'ABCD.csv'

评论

1赞 akrun 9/17/2020
是的,它也会删除。为什么你需要之后的 Can That 也是字面意思,即.\\..foo..
0赞 stephanmg 9/17/2020
你当然是对的,这是一个错别字。我的错。现在我不能再编辑它了。
1赞 akrun 9/17/2020
@stephanmg 可能存在一些边缘情况,例如不知道如何处理这些foo.
1赞 akrun 9/18/2020
@stephanmgI会说正则表达式会更自定义,即它不能应用于所有一般情况。假设如果 OP 提到他/她只会在最后有并且没有其他情况,这将起作用.<word>
1赞 stephanmg 9/18/2020
好吧,我认为这很好。
206赞 Tyler Rinker 3/18/2015 #2

标准安装工具包中有一个内置功能,可以获取不带扩展名的文件。file_path_sans_ext

tools::file_path_sans_ext("ABCD.csv")
## [1] "ABCD"

评论

10赞 thelatemail 3/18/2015
任何想要了解有关此功能和类似功能的更多详细信息的人,请查看?tools::file_ext
6赞 ah bon 12/23/2021
经过测试,我认为最好将文件路径放入.basename()file_path_sans_ext(basename(filepath))
49赞 Jason V 3/18/2015 #3

basename还将删除指向该文件的路径。使用此正则表达式,任何扩展名都将被删除。

filepath <- "d:/Some Dir/ABCD.csv"
sub(pattern = "(.*)\\..*$", replacement = "\\1", basename(filepath))

# [1] "ABCD"

或者,按照 Tyler Rinker 的建议:file_path_sans_ext

file_path_sans_ext(basename(filepath))

# [1] "ABCD"

评论

3赞 Jason V 11/14/2015
特殊情况:一个文件有“多个扩展名”,比如“ABCD.txt.csv”(是的,它发生了),然后只需添加一个“?”,使表达式不贪婪:sub(pattern = "(.*?)\\..*$", replacement = "\\1", basename(filepath))
6赞 Agaz Wani 3/18/2015 #4

您也可以尝试以下操作:

data <- "ABCD.csv"
gsub(pattern = "\\.csv$", "", data)

#[1] "ABCD"

在文件列表的情况下,这也会有所帮助,比如说

data <- list.files(pattern="\\.csv$"),使用该代码将删除列表中所有文件的扩展名。

2赞 Roler 1/30/2020 #5

下面是一个适用于压缩和多个文件的实现:

remove.file_ext <- function(path, basename = FALSE) {
  out <- c()
  for (p in path) {
    fext <- file_ext(path)
    compressions <- c("gzip", "gz", "bgz", "zip")
    areCompressed <- fext %in% compressions
    if (areCompressed) {
      ext <- file_ext(file_path_sans_ext(path, compression = FALSE))
      regex <- paste0("*\\.",ext,"\\.", fext,"$")
    } else {
      regex <- paste0("*\\.",fext,"$")
    }
    new <- gsub(pattern = regex, "", path)
    out <- c(out, new)
  }
  return(ifelse(basename, basename(out), out))
}
2赞 SJGD 2/4/2020 #6

加载所需的库:

> library(stringr)

从正则表达式中提取所有匹配项:

> str_match("ABCD.csv", "(.*)\\..*$")
     [,1]       [,2]  
[1,] "ABCD.csv" "ABCD"

仅返回结果的第二部分,该部分对应于与文件名匹配的组:

> str_match("ABCD.csv", "(.*)\\..*$")[,2]
[1] "ABCD"

@U-10-Forward 的 EDIT:

它与其他答案的原理基本相同。只是我发现这个解决方案更强大。

正则表达式意味着:

  • () = 组

  • .* = 除换行符外的任何单个字符,任意次数

  • 是转义符号,因此 //。字面意思是“”。

  • .* = 任意字符,再重复任意次数

  • $ 表示应位于输入字符串的末尾

逻辑是,它将返回字符串末尾的“.”前面的组,后跟一组字符(在本例中等于文件扩展名)。

6赞 stephanmg 9/17/2020 #7

如果您的文件名包含多个(可能的扩展名),并且只想去掉最后一个扩展名,则可以尝试以下操作。

考虑文件名foo.bar.baz.txt

sub('\\..[^\\.]*$', '', "foo.bar.baz.txt")

会给你留下.foo.bar.baz

11赞 wibeasley 6/23/2021 #8

fs::p ath_ext_remove()“删除最后一个扩展名并返回路径的其余部分”。

fs::path_ext_remove(c("ABCD.csv", "foo.bar.baz.txt", "d:/Some Dir/ABCD.csv"))

# Produces: [1] "ABCD"             "foo.bar.baz"      "D:/Some Dir/ABCD"
2赞 Abram Fleishman 5/24/2022 #9

上面的答案很好,但我感兴趣的是哪个是一次处理数百万条路径的最快方法。似乎通过这个 SO 问题使用是将文件名从路径中取出的最快方法。然后比较上述三种方法,使用速度更快。subtools::file_path_sans_ext

library(fs)
library(stringr)
library(microbenchmark)

files<-paste0("http://some/ppath/to/som/cool/file/",1:1000,".flac")

microbenchmark(
    fs::path_ext_remove(sub(".*/", "", files)),
    tools::file_path_sans_ext(sub(".*/", "", files)),
    str_extract(files,  '(?<=[/])([^/]+)(?=\\.[^.]+)')
    
) 
Unit: milliseconds
                                                expr     min       lq      mean   median      uq     max neval
          fs::path_ext_remove(sub(".*/", "", files)) 10.6273 10.98940 11.323063 11.20500 11.4992 14.5834   100
    tools::file_path_sans_ext(sub(".*/", "", files))  1.3717  1.44260  1.532092  1.48560  1.5588  2.4806   100
 str_extract(files, "(?<=[/])([^/]+)(?=\\\\.[^.]+)")  7.4197  7.62875  7.985206  7.88835  8.2311  9.4107   100
0赞 Fkiran 11/24/2023 #10

你可以使用substring()

filename <- "test_channels.csv"
only.extension <- substring(filename,nchar(filename) - 3 )
without_ext.name <- substring(filename,1, nchar(filename) - 4 )

# verify
only.extension
without_ext.name

我希望它会有所帮助。