Відповіді:
Так. Використовуйте 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"