Відповіді:
Так. Використовуйте 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('.') vs ['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]потім.
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
filenameповернення останнього символу , якщо ім'я файлу взагалі немає .. Це тому, що rfindповертається, -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"