Как я могу извлечь расширение файла, учитывая путь к файлу в виде символа? Я знаю, что могу сделать это с помощью регулярного выражения regexpr("\\.([[:alnum:]]+)$", x)
, но интересно, есть ли встроенная функция для этого?
Извлечь расширение файла из пути к файлу
Ответы (6)
Это то, что легко найти с помощью базовых инструментов R. Например: ??путь.
В любом случае, загрузите пакет tools
и прочитайте ?file_ext
.
person
Carl Witthoft
schedule
15.10.2011
Он не отображается с
??"extensions"
, хотя можно было бы ожидать, что он будет.
- person IRTFM; 15.10.2011
@DWin: терпение, кузнечик :-). Я бы также рекомендовал package:sos . Это очень круто.
- person Carl Witthoft; 15.10.2011
Витхоф: Меня озадачивают два аспекта; как pkg:sos устраняет отсутствие отображения tools::fiie_ext с помощью ??(), когда разумный человек этого ожидает; и нужно ли терпение, чтобы получить ценность от стратегии поиска, которая обеспечивает 20 страниц с 400 посещениями?
- person IRTFM; 15.10.2011
sos
выполняет полнотекстовый поиск. ??
ищет только метаданные (название, ключевые слова и т. д.). Кроме того, не так уж сложно просмотреть результаты. (Я пробовал findFn("{file extension}")
, "extract {file extension}"
и "{extract file extension}"
, первый был лучше.)
- person Ben Bolker; 16.10.2011
Это было бы более полезно с фактическим образцом кода
- person user5359531; 11.07.2017
@ user5359531 Вы читали
?file-ext
? однострочный пример кода выглядит глупо
- person Carl Witthoft; 12.07.2017
Обратите внимание: tools::file_ext('foo.csv.gz') возвращают 'gz', а не 'csv.gz'
- person Zachary Ryan Smith; 11.11.2018
@ZacharyRyanSmith Ну, это потому, что расширение в вашем примере — gz, поэтому код работает правильно. Нет такого понятия, как двойное расширение
- person Carl Witthoft; 12.11.2018
@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
Пожалуйста, прокрутите вверх и прочитайте принятый ответ на этот вопрос.
- person Rich Scriven; 04.11.2017
Спасибо, Рич! Я прочитал этот комментарий и добавил этот код только для того, чтобы показать, как он выглядит в простом фрагменте кода. Может быть, это будет полезно для кого-то.
- person Andrii; 05.11.2017
Другой комментарий, возможно, был первым и принятым, но приятно видеть написанное решение. Принятый ответ просто говорит вам, где вы найдете ответ. Этот на самом деле отвечает на вопрос.
- person Dannid; 16.08.2019
Не используйте
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
Функции
basename
и dirname
избавляют от части работы здесь.
- person MichaelChirico; 29.11.2017
@ Pisca46: я хотел бы использовать подобную функцию в пакете R. Вы написали функцию? Если нет, не могли бы вы добавить ссылку в свой ответ?
- person Mikko; 01.12.2017
Да, я сам написал функцию.
- 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
Можете ли вы прокомментировать, как это улучшение по сравнению с
tools::file_ext
?
- person Roman Luštrik; 09.10.2018
Вам лучше использовать функцию
tools
- person Enrique Pérez Herrero; 09.10.2018
Предложенная функция работает некорректно, если файл содержит точки в имени файла. Функция разбивает имя файла и выводит второй элемент, а должна выводить последний. Для следующего имени файла «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