Câu trả lời:
Đúng. Sử dụng os.path.splitext
(xem tài liệu Python 2.X hoặc tài liệu Python 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
Không giống như hầu hết các nỗ lực tách chuỗi thủ công, os.path.splitext
sẽ coi chính xác /a/b.c/d
là không có tiện ích mở rộng thay vì có tiện ích mở rộng .c/d
và nó sẽ coi .bashrc
là không có tiện ích mở rộng thay vì có tiện ích mở rộng .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
endswith()
di động và pythonic hơn?
.asd
thực sự là phần mở rộng !! Nếu bạn nghĩ về nó, foo.tar.gz
là một tệp nén gzip ( .gz
) xảy ra là một tệp tar ( .tar
). Nhưng nó là một tập tin gzip ở vị trí đầu tiên. Tôi sẽ không mong đợi nó sẽ trả lại phần mở rộng kép.
splittext
. Nếu họ chỉ cần làm bất cứ điều gì để biểu thị sự phá vỡ giữa các phần của tên này, sẽ dễ dàng hơn nhiều để nhận ra rằng đó là splitExt
hoặc split_ext
. Chắc chắn tôi không thể là người duy nhất mắc lỗi này?
os.path.splitext('somefile.ext')
=> ('somefile', '.ext')
. Hãy thoải mái cung cấp một ví dụ truy cập thực tế mà không cần tham khảo một số thư viện bên thứ ba.
import os.path
extension = os.path.splitext(filename)[1]
import os.path
thay vì from os import path
?
from os import path
thì tên path
được đưa lên trong phạm vi cục bộ của bạn, những người khác đang xem mã có thể không biết ngay đường dẫn đó là đường dẫn từ mô-đun os. Nếu bạn sử dụng import os.path
nó sẽ giữ nó trong os
không gian tên và bất cứ nơi nào bạn thực hiện cuộc gọi, mọi người sẽ biết ngay path()
từ os
mô-đun.
_, extension = os.path.splitext(filename)
trông đẹp hơn nhiều.
if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Mới trong phiên bản 3.4.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
Tôi ngạc nhiên không ai nhắc đến pathlib
,pathlib
thật tuyệt vời!
Nếu bạn cần tất cả các hậu tố (ví dụ nếu bạn có a .tar.gz
), .suffixes
sẽ trả về một danh sách của chúng!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
để đảm bảo chỉ nhận được .tar.gz.
Một tùy chọn có thể được tách từ dấu chấm:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Không có lỗi khi tệp không có phần mở rộng:
>>> "filename".split(".")[-1]
'filename'
Nhưng bạn phải cẩn thận:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
với 'file.tar.gz'.split('.')
vs ['file.tar', 'gz']
với 'file.tar.gz'.rsplit('.', 1)
. vâng, có thể
Bất kỳ giải pháp nào ở trên đều hoạt động, nhưng trên linux tôi đã thấy rằng có một dòng mới ở cuối chuỗi mở rộng sẽ ngăn các kết quả khớp thành công. Thêm strip()
phương thức vào cuối. Ví dụ:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
trong .splittext(filename)[1][1:]
) - cảm ơn bạn trước
splittext()
(không giống như nếu bạn tách một chuỗi bằng '.') Bao gồm '.' nhân vật trong phần mở rộng. Việc bổ sung [1:]
được loại bỏ nó.
Với splitext có những vấn đề với các tập tin với phần mở rộng gấp đôi (ví dụ file.tar.gz
, file.tar.bz2
, vv ..)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
nhưng nên: .tar.gz
Các giải pháp có thể có ở đây
gunzip somefile.tar.gz
Tên tập tin đầu ra là gì?
Mặc dù đây là một chủ đề cũ, nhưng tôi tự hỏi tại sao không có đề cập đến một api rất đơn giản của con trăn được gọi là rpartition trong trường hợp này:
để có được phần mở rộng của một đường dẫn tuyệt đối của tệp đã cho, bạn chỉ cần gõ:
filepath.rpartition('.')[-1]
thí dụ:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
sẽ cung cấp cho bạn: 'csv'
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Nếu không tìm thấy dấu phân cách, bộ dữ liệu được trả về sẽ là : ("", "", "the original string")
.
Ngạc nhiên vì điều này chưa được đề cập:
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
Những lợi ích:
Như chức năng:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
[-1]
sau đó.
Bạn có thể sử dụng một split
trên filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Điều này không cần thêm thư viện
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
filename
được trả về nếu tên tệp hoàn toàn không có .
. Điều này là do rfind
trả về -1
nếu không tìm thấy chuỗi.
Đây là một kỹ thuật biểu diễn chuỗi trực tiếp: Tôi thấy rất nhiều giải pháp được đề cập, nhưng tôi nghĩ hầu hết đang xem xét phân tách. Tuy nhiên, phân tách làm điều đó tại mọi lần xuất hiện của "." . Những gì bạn muốn tìm kiếm là phân vùng.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Một giải pháp khác với sự phân chia đúng:
# 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])
Ngay cả câu hỏi này đã được trả lời, tôi sẽ thêm giải pháp vào Regex.
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
\.[0-9a-z]+$
như trong bài viết này .
Một lót thực sự, nếu bạn thích regex. Và nó không quan trọng ngay cả khi bạn có thêm "." ở giữa
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Xem ở đây để biết kết quả: Bấm vào đây
Đây là Phương pháp đơn giản nhất để có được cả Tên tệp & Tiện ích mở rộng chỉ trong một dòng .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
Không giống như các giải pháp khác, bạn không cần nhập bất kỳ gói nào cho việc này.
Đối với các cuộc vui ... chỉ cần thu thập các tiện ích mở rộng trong một lệnh và theo dõi tất cả chúng trong một thư mục. Sau đó, chỉ cần kéo các phần mở rộng bạn muốn.
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)
thử cái này:
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
là tên tệp hợp lệ. Điều gì xảy ra nếu tôi ném mã đó vào mã của bạn? Thế còn .bashrc
hay foo
? Có một chức năng thư viện cho điều này vì một lý do ...
# 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(".")
Điều đó sẽ cung cấp cho bạn tên tệp cho đến "." Đầu tiên, là tên phổ biến nhất.
file.name.ext
basename
có một chút khó hiểu ở đây kể từ khios.path.basename("/path/to/somefile.ext")
trở lại"somefile.ext"