Ответы:
Да. Используйте 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', '')
endswith()
будет ли более портативным и питоническим?
.asd
действительно расширение !! Если вы думаете об этом, foo.tar.gz
это сжатый gzip файл ( .gz
), который является tar-файлом ( .tar
). Но это GZIP-файл в первую очередь. Я не ожидал бы, что это возвратит двойное расширение вообще.
splittext
. Если бы они просто сделали что-нибудь, чтобы обозначить разрыв между частями этого имени, было бы намного легче признать, что это splitExt
или split_ext
. Конечно, я не могу быть единственным человеком, который сделал эту ошибку?
os.path.splitext('somefile.ext')
=> ('somefile', '.ext')
. Не стесняйтесь приводить реальный контрпример без ссылки на стороннюю библиотеку.
import os.path
extension = os.path.splitext(filename)[1]
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.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
Я удивлен, что никто еще не упомянул pathlib
, это pathlib
круто!
Если вам нужны все суффиксы (например, если у вас есть .tar.gz
), .suffixes
вернет список их!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
чтобы обеспечить получение только .tar.gz максимум.
Одним из вариантов может быть расщепление от точки:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Нет ошибки, если файл не имеет расширения:
>>> "filename".split(".")[-1]
'filename'
Но вы должны быть осторожны
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
с 'file.tar.gz'.split('.')
против ['file.tar', 'gz']
с 'file.tar.gz'.rsplit('.', 1)
. да, может быть
Любое из приведенных выше решений работает, но в linux я обнаружил, что в конце строки расширения есть новая строка, которая будет препятствовать успешному совпадению. Добавьте strip()
метод до конца. Например:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
в .splittext(filename)[1][1:]
) - заранее спасибо
splittext()
(в отличие от разделения строки с помощью «.») Включает в себя «.» символ в расширении. Дополнительный [1:]
избавляется от этого.
При использовании splitext возникают проблемы с файлами с двойным расширением (например file.tar.gz
, file.tar.bz2
и т. Д.)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
но должно быть: .tar.gz
Возможные решения здесь
gunzip somefile.tar.gz
какое имя файла на выходе?
Хотя это старая тема, но мне интересно, почему никто не упоминает очень простой API Python под названием rpartition в этом случае:
чтобы получить расширение заданного абсолютного пути к файлу, вы можете просто набрать:
filepath.rpartition('.')[-1]
пример:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
даст вам: "CSV"
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Если нет разделителя найден, то возвращается кортеж будет: ("", "", "the original string")
.
Удивлен, это еще не упоминалось:
import os
fn = '/some/path/a.tar.gz'
basename = os.path.basename(fn) # os independent
Out[] a.tar.gz
base = basename.split('.')[0]
Out[] a
ext = '.'.join(basename.split('.')[1:]) # <-- main part
# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz
Льготы:
Как функция:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]
потом.
Вы можете использовать split
на filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Это не требует дополнительной библиотеки
Это техника прямого представления строк: я вижу много упомянутых решений, но думаю, что большинство рассматривает разделение. Сплит, однако, делает это при каждом появлении "." , То, что вы бы предпочли, это раздел.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Другое решение с правым разделением:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])
Даже на этот вопрос уже дан ответ, я бы добавил решение в Regex.
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
\.[0-9a-z]+$
как в этом посте .
Настоящий однострочник, если вам нравится регулярное выражение. И это не имеет значения, даже если у вас есть дополнительные "." в середине
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Смотрите здесь для результата: Нажмите здесь
Это самый простой способ получить имя файла и расширение в одну строку .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
В отличие от других решений, вам не нужно импортировать какой-либо пакет для этого.
Для забавы ... просто соберите расширения в диктовке и отследите их все в папке. Затем просто потяните нужные вам расширения.
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
попробуй это:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
является допустимым именем файла. Что произойдет, если я добавлю это в ваш код? Как насчет .bashrc
или foo
? По этой причине есть библиотечная функция ...
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
def NewFileName(fichier):
cpt = 0
fic , *ext = fichier.split('.')
ext = '.'.join(ext)
while os.path.isfile(fichier):
cpt += 1
fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
return fichier
name_only=file_name[:filename.index(".")
Это даст вам имя файла до первого «.», Который будет наиболее распространенным.
file.name.ext
basename
немного сбивает с толку здесь, такos.path.basename("/path/to/somefile.ext")
как вернется"somefile.ext"