Есть ли функция для извлечения расширения из имени файла?
1303
Есть ли функция для извлечения расширения из имени файла?
Да. Используйте os.path.splitext
(см. Документацию по Python 2.X или документацию по Python 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
В отличие от большинства попыток ручного разделения строк, он os.path.splitext
будет корректно обрабатываться /a/b.c/d
как не имеющий расширения .c/d
, а не .bashrc
как расширение , и будет обрабатываться как не имеющий расширения вместо расширения .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
basename
немного сбивает с толку здесь, такos.path.basename("/path/to/somefile.ext")
как вернется"somefile.ext"
endswith()
будет ли более портативным и питоническим?.asd
действительно расширение !! Если вы думаете об этом,foo.tar.gz
это сжатый gzip файл (.gz
), который является tar-файлом (.tar
). Но это GZIP-файл в первую очередь. Я не ожидал бы, что это возвратит двойное расширение вообще.splittext
. Если бы они просто сделали что-нибудь, чтобы обозначить разрыв между частями этого имени, было бы намного легче признать, что этоsplitExt
илиsplit_ext
. Конечно, я не могу быть единственным человеком, который сделал эту ошибку?os.path.splitext('somefile.ext')
=>('somefile', '.ext')
. Не стесняйтесь приводить реальный контрпример без ссылки на стороннюю библиотеку.источник
import os.path
вместоfrom os import path
?from os import path
имя, то оноpath
будет занято в вашей локальной области видимости, и другие, глядя на код, могут не сразу узнать, что путь - это путь от модуля os. Где, как будто вы используетеimport os.path
его, он удерживает его вos
пространстве имен, и где бы вы ни делали вызов, люди сразу узнают, что онpath()
изos
модуля._, extension = os.path.splitext(filename)
выглядит намного лучше.if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Новое в версии 3.4.
Я удивлен, что никто еще не упомянул
pathlib
, этоpathlib
круто!Если вам нужны все суффиксы (например, если у вас есть
.tar.gz
),.suffixes
вернет список их!источник
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
чтобы обеспечить получение только .tar.gz максимум.Чтобы получить только текст расширения, без точки.
источник
Одним из вариантов может быть расщепление от точки:
Нет ошибки, если файл не имеет расширения:
Но вы должны быть осторожны
источник
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
с'file.tar.gz'.split('.')
против['file.tar', 'gz']
с'file.tar.gz'.rsplit('.', 1)
. да, может бытьСтоит добавить туда пониже, чтобы вы не задавались вопросом, почему JPG не отображаются в вашем списке.
источник
Любое из приведенных выше решений работает, но в linux я обнаружил, что в конце строки расширения есть новая строка, которая будет препятствовать успешному совпадению. Добавьте
strip()
метод до конца. Например:источник
[1:]
в.splittext(filename)[1][1:]
) - заранее спасибоsplittext()
(в отличие от разделения строки с помощью «.») Включает в себя «.» символ в расширении. Дополнительный[1:]
избавляется от этого.При использовании splitext возникают проблемы с файлами с двойным расширением (например
file.tar.gz
,file.tar.bz2
и т. Д.)но должно быть:
.tar.gz
Возможные решения здесь
источник
gunzip somefile.tar.gz
какое имя файла на выходе?Вы можете найти некоторые замечательные вещи в модуле pathlib (доступно в python 3.x).
источник
Хотя это старая тема, но мне интересно, почему никто не упоминает очень простой API Python под названием rpartition в этом случае:
чтобы получить расширение заданного абсолютного пути к файлу, вы можете просто набрать:
пример:
даст вам: "CSV"
источник
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Если нет разделителя найден, то возвращается кортеж будет:("", "", "the original string")
.Просто
join
всеpathlib suffixes
.источник
Удивлен, это еще не упоминалось:
Льготы:
Как функция:
источник
[-1]
потом.Вы можете использовать
split
наfilename
:Это не требует дополнительной библиотеки
источник
источник
filename
возвращается, если имя файла вообще не имеет.
. Это потому, чтоrfind
возвращает,-1
если строка не найдена.Это техника прямого представления строк: я вижу много упомянутых решений, но думаю, что большинство рассматривает разделение. Сплит, однако, делает это при каждом появлении "." , То, что вы бы предпочли, это раздел.
источник
Другое решение с правым разделением:
источник
Даже на этот вопрос уже дан ответ, я бы добавил решение в Regex.
источник
\.[0-9a-z]+$
как в этом посте .Настоящий однострочник, если вам нравится регулярное выражение. И это не имеет значения, даже если у вас есть дополнительные "." в середине
Смотрите здесь для результата: Нажмите здесь
источник
Это самый простой способ получить имя файла и расширение в одну строку .
В отличие от других решений, вам не нужно импортировать какой-либо пакет для этого.
источник
Для забавы ... просто соберите расширения в диктовке и отследите их все в папке. Затем просто потяните нужные вам расширения.
источник
попробуй это:
источник
foo.tar
является допустимым именем файла. Что произойдет, если я добавлю это в ваш код? Как насчет.bashrc
илиfoo
? По этой причине есть библиотечная функция ...источник
источник
Это даст вам имя файла до первого «.», Который будет наиболее распространенным.
источник
file.name.ext