Извлечь расширение файла из пути к файлу

Как я могу извлечь расширение файла, учитывая путь к файлу в виде символа? Я знаю, что могу сделать это с помощью регулярного выражения regexpr("\\.([[:alnum:]]+)$", x), но интересно, есть ли встроенная функция для этого?


person SFun28    schedule 15.10.2011    source источник


Ответы (6)


Это то, что легко найти с помощью базовых инструментов R. Например: ??путь.

В любом случае, загрузите пакет tools и прочитайте ?file_ext.

person Carl Witthoft    schedule 15.10.2011
comment
Он не отображается с ??"extensions", хотя можно было бы ожидать, что он будет. - person IRTFM; 15.10.2011
comment
@DWin: терпение, кузнечик :-). Я бы также рекомендовал package:sos . Это очень круто. - person Carl Witthoft; 15.10.2011
comment
Витхоф: Меня озадачивают два аспекта; как pkg:sos устраняет отсутствие отображения tools::fiie_ext с помощью ??(), когда разумный человек этого ожидает; и нужно ли терпение, чтобы получить ценность от стратегии поиска, которая обеспечивает 20 страниц с 400 посещениями? - person IRTFM; 15.10.2011
comment
sos выполняет полнотекстовый поиск. ?? ищет только метаданные (название, ключевые слова и т. д.). Кроме того, не так уж сложно просмотреть результаты. (Я пробовал findFn("{file extension}"), "extract {file extension}" и "{extract file extension}", первый был лучше.) - person Ben Bolker; 16.10.2011
comment
Это было бы более полезно с фактическим образцом кода - person user5359531; 11.07.2017
comment
@ user5359531 Вы читали ?file-ext ? однострочный пример кода выглядит глупо - person Carl Witthoft; 12.07.2017
comment
Обратите внимание: tools::file_ext('foo.csv.gz') возвращают 'gz', а не 'csv.gz' - person Zachary Ryan Smith; 11.11.2018
comment
@ZacharyRyanSmith Ну, это потому, что расширение в вашем примере — gz, поэтому код работает правильно. Нет такого понятия, как двойное расширение - person Carl Witthoft; 12.11.2018
comment
@CarlWitthoft, это правда. Я просто предупреждал людей, которые путают суффикс пути с расширением файла (таких как я). - person Zachary Ryan Smith; 12.11.2018

Позвольте мне расширить немного отличный ответ из https://stackoverflow.com/users/680068/zx8754

Вот простой фрагмент кода

  # 1. Load library 'tools'
  library("tools")

  # 2. Get extension for file 'test.txt'
  file_ext("test.txt")

Результат должен быть «txt».

person Andrii    schedule 04.11.2017
comment
Пожалуйста, прокрутите вверх и прочитайте принятый ответ на этот вопрос. - person Rich Scriven; 04.11.2017
comment
Спасибо, Рич! Я прочитал этот комментарий и добавил этот код только для того, чтобы показать, как он выглядит в простом фрагменте кода. Может быть, это будет полезно для кого-то. - person Andrii; 05.11.2017
comment
Другой комментарий, возможно, был первым и принятым, но приятно видеть написанное решение. Принятый ответ просто говорит вам, где вы найдете ответ. Этот на самом деле отвечает на вопрос. - person Dannid; 16.08.2019
comment
Не используйте library(tools), если можно просто использовать tools::file_ext, например, tools::file_ext("test.txt"). - person bers; 16.07.2021

простая функция без пакета для загрузки:

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

Приведенное выше регулярное выражение завершается ошибкой, если расширение содержит не 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

}

person Pisca46    schedule 02.08.2017
comment
Функции basename и dirname избавляют от части работы здесь. - person MichaelChirico; 29.11.2017
comment
@ Pisca46: я хотел бы использовать подобную функцию в пакете R. Вы написали функцию? Если нет, не могли бы вы добавить ссылку в свой ответ? - person Mikko; 01.12.2017
comment
Да, я сам написал функцию. - person Pisca46; 05.12.2017

Эта функция использует каналы:

library(magrittr)

file_ext <- function(f_name) {
  f_name %>%
    strsplit(".", fixed = TRUE) %>%
    unlist %>%
    extract(2)
 }

 file_ext("test.txt")
 # [1] "txt"
person Enrique Pérez Herrero    schedule 05.03.2018
comment
Можете ли вы прокомментировать, как это улучшение по сравнению с tools::file_ext? - person Roman Luštrik; 09.10.2018
comment
Вам лучше использовать функцию tools - person Enrique Pérez Herrero; 09.10.2018
comment
Предложенная функция работает некорректно, если файл содержит точки в имени файла. Функция разбивает имя файла и выводит второй элемент, а должна выводить последний. Для следующего имени файла «file.name.txt» выводится «имя», а не «txt». tools::file_ext работает нормально. - person Sergiy; 30.06.2021

извлечь расширение файла только без точки:

tools::file_ext(fileName)

извлечь расширение файла с точкой:

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

person Guodong Chen    schedule 27.02.2021