जवाबों:
हाँ। उपयोग करें os.path.splitext
( पायथन 2. एक्स प्रलेखन या पायथन 3. एक्स प्रलेखन देखें ):
>>> 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()
नहीं अधिक पोर्टेबल और pythonic हो सकता है?
.asd
वास्तव में विस्तार है !! यदि आप इसके बारे में सोचते हैं, foo.tar.gz
तो एक गज़िप-संपीड़ित फ़ाइल ( .gz
) है जो एक टार फ़ाइल ( .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
आपके स्थानीय दायरे में लिया जाता है, साथ ही अन्य जो कोड को देख रहे हैं वे तुरंत नहीं जान सकते हैं कि पथ ओएस मॉड्यूल से पथ है। अगर आप का उपयोग के रूप में कहाँ 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:]
केवल सुनिश्चित करने के लिए किया जाना चाहिए ।
एक विकल्प डॉट से अलग हो सकता है:
>>> 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)
। हाँ, हो सकता है।
ऊपर दिए गए समाधानों में से कोई भी कार्य, लेकिन लिनक्स पर मैंने पाया है कि एक्सटेंशन स्ट्रिंग के अंत में एक नई रेखा है जो मैचों को सफल होने से रोकेगी। 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
आउटपुट फ़ाइल नाम क्या है?
हालाँकि यह एक पुराना विषय है, लेकिन मुझे आश्चर्य है कि इस मामले में विचित्रता का एक बहुत ही सरल एपि का उल्लेख क्यों नहीं किया गया है:
दिए गए फ़ाइल निरपेक्ष पथ का विस्तार पाने के लिए, आप बस टाइप कर सकते हैं:
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])
एक सच्चा वन-लाइनर, अगर आपको रेगेक्स पसंद है। और इससे कोई फर्क नहीं पड़ता कि आपके पास अतिरिक्त है "।" बीच में
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"