पायथन में फ़ाइल नाम से एक्सटेंशन का विस्तार


जवाबों:


1986

हाँ। उपयोग करें 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', '')

15
यहाँ का उपयोग basenameथोड़ा भ्रमित करने वाला है क्योंकि os.path.basename("/path/to/somefile.ext")वह वापस आयेगा"somefile.ext"
जियारो

16
नहीं होता endswith()नहीं अधिक पोर्टेबल और pythonic हो सकता है?
सेबेस्टियन मच

79
@ klingt.net ठीक है, इस मामले में, .asdवास्तव में विस्तार है !! यदि आप इसके बारे में सोचते हैं, foo.tar.gzतो एक गज़िप-संपीड़ित फ़ाइल ( .gz) है जो एक टार फ़ाइल ( .tar) होती है। लेकिन यह पहली जगह में एक gzip फ़ाइल है। मुझे उम्मीद नहीं है कि यह दोहरी विस्तार को वापस कर देगा।
nosklo

157
मानक पायथन फ़ंक्शन नामकरण सम्मेलन वास्तव में कष्टप्रद है - लगभग हर बार जब मैं इसे फिर से देखता हूं, तो मैं इसे गलत मानता हूं splittext। वे सिर्फ इस नाम के कुछ हिस्सों के बीच ब्रेक सूचित करने के लिए कुछ भी कर रहे हैं, तो यह बहुत पहचान करने के लिए बस इतना ही आसान होगा splitExtया split_ext। निश्चित रूप से मैं अकेला व्यक्ति नहीं हो सकता जिसने यह गलती की है?
ArtOfWarfare

9
@Vingtoft आपने अपनी टिप्पणी में werkzeug के FileStorage के बारे में कुछ भी उल्लेख नहीं किया है और इस प्रश्न में उस विशेष परिदृश्य के बारे में कुछ भी नहीं है। कुछ गलत हो सकता है कि आप फ़ाइल नाम कैसे पारित करते हैं। os.path.splitext('somefile.ext')=> ('somefile', '.ext')। कुछ तृतीय पक्ष पुस्तकालय का संदर्भ लिए बिना स्वतंत्र महसूस करें।
गेवथेन

399
import os.path
extension = os.path.splitext(filename)[1]

15
जिज्ञासा से बाहर, import os.pathइसके बजाय क्यों from os import path?
किस्वा

2
ओह, मैं सोच रहा था कि क्या इसके पीछे एक विशिष्ट कारण था (सम्मेलन के अलावा)। मैं अभी भी अजगर सीख रहा हूं और अधिक सीखना चाहता हूं!
किस्वा

55
यह वास्तव में निर्भर करता है, यदि आप उपयोग करते हैं from os import pathतो नाम pathआपके स्थानीय दायरे में लिया जाता है, साथ ही अन्य जो कोड को देख रहे हैं वे तुरंत नहीं जान सकते हैं कि पथ ओएस मॉड्यूल से पथ है। अगर आप का उपयोग के रूप में कहाँ import os.pathयह के भीतर रहता है osनाम स्थान और जहां भी आप कॉल करने के लोगों को पता है कि यह path()से osतुरंत मॉड्यूल।
dennmat

18
मुझे पता है कि यह शब्दार्थिक रूप से अलग नहीं है, लेकिन मैं व्यक्तिगत _, extension = os.path.splitext(filename)रूप से बहुत अच्छे दिखने वाले निर्माण का पता लगाता हूं ।
टिम गिल्बर्ट

3
आप एक अधिक जटिल अभिव्यक्ति के हिस्से के रूप विस्तार चाहते हैं [1] और अधिक उपयोगी हो सकता है: if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
gerardw

238

संस्करण 3.4 में नया।

import pathlib

print(pathlib.Path('yourPath.example').suffix) # '.example'

मुझे आश्चर्य है कि किसी ने pathlibअभी तक उल्लेख नहीं किया है, pathlibभयानक है!

यदि आपको सभी प्रत्ययों (जैसे यदि आपके पास .tar.gz) की आवश्यकता है, तो .suffixesउनकी सूची वापस कर देंगे!


12
उदाहरण के लिए .tar.gz:''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
user3780389

बहुत बढ़िया जवाब। मुझे यह ट्यूटोरियल दस्तावेज़ीकरण से अधिक उपयोगी लगा
user118967

@ user3780389 "foo.bar.tar.gz" अभी भी मान्य ".tar.gz" नहीं होगा? यदि ऐसा है तो आपके स्निपेट का उपयोग .suffixes[-2:]केवल सुनिश्चित करने के लिए किया जाना चाहिए ।
jeromej

111
import os.path
extension = os.path.splitext(filename)[1][1:]

बिना विस्तार के केवल पाठ प्राप्त करने के लिए, बिना डॉट के।


73

एक विकल्प डॉट से अलग हो सकता है:

>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'

कोई त्रुटि नहीं है जब फ़ाइल में एक्सटेंशन नहीं है:

>>> "filename".split(".")[-1]
'filename'

लेकिन आपको सावधान रहना चाहिए:

>>> "png".split(".")[-1]
'png'    # But file doesn't have an extension

4
यदि आप x.tar.gz
किरिल

19
वास्तव में ऐसा नहीं है। "X.tar.gz" नामक फ़ाइल का एक्सटेंशन "gz" है न कि "tar.gz"। os.path.splitext ".os" को भी विस्तार देता है।
मुरात Murorlu

1
क्या हम [-1] के बजाय [1] का उपयोग कर सकते हैं। मैं समझ नहीं पाया [-1] विभाजन के साथ
user765443

7
[-1] डॉट द्वारा छीनी गई वस्तुओं का अंतिम आइटम प्राप्त करने के लिए। उदाहरण:"my.file.name.js".split('.') => ['my','file','name','js]
मूरत luorlu

1
@BenjaminR आह ठीक है, आप परिणाम सूची के बारे में एक अनुकूलन कर रहे हैं। ['file', 'tar', 'gz']साथ 'file.tar.gz'.split('.') बनाम ['file.tar', 'gz'] साथ 'file.tar.gz'.rsplit('.', 1)। हाँ, हो सकता है।
मुरात Murorlu

40

वहाँ एक कम जोड़ने के लायक है ताकि आप अपने आप को आश्चर्यचकित न करें कि जेपीजी आपकी सूची में क्यों नहीं दिख रहा है।

os.path.splitext(filename)[1][1:].strip().lower()

19

ऊपर दिए गए समाधानों में से कोई भी कार्य, लेकिन लिनक्स पर मैंने पाया है कि एक्सटेंशन स्ट्रिंग के अंत में एक नई रेखा है जो मैचों को सफल होने से रोकेगी। strip()विधि को अंत तक जोड़ें । उदाहरण के लिए:

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 

1
मेरी समझ में सहायता करने के लिए, क्या आप बता सकते हैं कि दूसरे इंडेक्स / स्लाइस गार्ड के खिलाफ क्या अतिरिक्त व्यवहार है? (यानी [1:]में .splittext(filename)[1][1:]) - अग्रिम धन्यवाद
सैमुअल हैमर

1
अपने लिए यह पता लगाया: splittext()(यदि आप '' 'का उपयोग करके एक स्ट्रिंग को विभाजित करते हैं)' 'शामिल हैं। विस्तार में चरित्र। अतिरिक्त इससे [1:]छुटकारा दिलाता है।
शमूएल हरमर

17

Splitext के साथ वहाँ डबल विस्तार के साथ फाइलों के साथ समस्याएं हैं (उदाहरण के लिए file.tar.gz, file.tar.bz2, आदि ..)

>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension 
'.gz'

लेकिन होना चाहिए: .tar.gz

संभावित समाधान यहां हैं


35
नहीं, यह होना चाहिए .gz
रॉबर्ट सिएमर

1
2 एक्सटेंशन पाने के लिए इसे दो बार करें?
मज्जा

1
@ मजाज़ हां। gunzip somefile.tar.gz आउटपुट फ़ाइल नाम क्या है?
FlipMcF

1
यही कारण है कि हमारे पास एक्सटेंशन 'tgz' है जिसका अर्थ है: tar + gzip! : डी
नूनो एनीकेटो

1
@peterhil मुझे नहीं लगता कि आप चाहते हैं कि आपके पायथन लिपि को फ़ाइल नाम बनाने के लिए उपयोग किए जाने वाले एप्लिकेशन के बारे में पता हो। यह सवाल के दायरे से बाहर है। उदाहरण पर मत लाइए, 'filename.csv.gz' भी काफी मान्य है।
FlipMcF

16

आप पाथलिब मॉड्यूल (अजगर 3.x में उपलब्ध) में कुछ बेहतरीन चीजें पा सकते हैं।

import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)

# Output 
'.txt'

14

हालाँकि यह एक पुराना विषय है, लेकिन मुझे आश्चर्य है कि इस मामले में विचित्रता का एक बहुत ही सरल एपि का उल्लेख क्यों नहीं किया गया है:

दिए गए फ़ाइल निरपेक्ष पथ का विस्तार पाने के लिए, आप बस टाइप कर सकते हैं:

filepath.rpartition('.')[-1]

उदाहरण:

path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]

आपको देगा: 'csv'


1
उन लोगों के लिए जो एपीआई से परिचित नहीं हैं, उनके लिए पुनर्मूल्यांकन टपल देता है ("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string"):। यदि कोई विभाजक नहीं मिला, तो लौटा हुआ टपल होगा ("", "", "the original string"):।
निकोले

13

बस joinसब pathlib suffixes

>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'

12

आश्चर्यचकित यह अभी तक उल्लेख नहीं किया गया था:

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
इसका अपवाद तब होता है जब फ़ाइल में कोई एक्सटेंशन नहीं होता है।
तिवुवेंकदम

4
यह जवाब बिल्कुल एक वैरिएंट को नजरअंदाज करता है अगर फ़ाइल नाम में कई बिंदु हैं। उदाहरण get_extension ('cmocka-1.1.0.tar.xz') => '.1.0.tar.xz' - गलत।
PADYMKO

@PADYMKO, IMHO को फ़ाइल नाम के भाग के रूप में पूर्ण विराम के साथ फ़ाइल नाम नहीं बनाना चाहिए। ऊपर दिए गए कोड को 'tar.xz' में परिणाम नहीं माना जाता है
वैन डेर

2
बस [-1]फिर बदलो ।
पास्कलवीकूटन

11

आप एक splitपर एक का उपयोग कर सकते हैं filename:

f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))

इसके लिए अतिरिक्त पुस्तकालय की आवश्यकता नहीं है


10
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]

2
इसका परिणाम यह होता है कि filenameयदि फ़ाइल नाम में कोई कमी नहीं है ., तो अंतिम रिटर्न दिया जाएगा । ऐसा इसलिए है क्योंकि स्ट्रिंग नहीं मिली है तो rfindरिटर्न -1
मैट

6

यह एक प्रत्यक्ष स्ट्रिंग प्रतिनिधित्व तकनीक है: मैं वर्णित कई समाधान देखता हूं, लेकिन मुझे लगता है कि अधिकांश विभाजन को देख रहे हैं। स्प्लिट हालांकि "की हर घटना पर करता है।" । आप जो चाहते हैं वह विभाजन है।

string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]

2
rpartition पहले से ही द्वारा सुझाव दिया गया था @weiyixie
निकोले


5

यहां तक ​​कि इस सवाल का पहले से ही जवाब है कि मैं रेगेक्स में समाधान जोड़ूंगा।

>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'

1
या इस पोस्ट\.[0-9a-z]+$ में के रूप में ।
16

2

एक सच्चा वन-लाइनर, अगर आपको रेगेक्स पसंद है। और इससे कोई फर्क नहीं पड़ता कि आपके पास अतिरिक्त है "।" बीच में

import re

file_ext = re.search(r"\.([^.]+)$", filename).group(1)

परिणाम के लिए यहां देखें: यहां क्लिक करें


0

यह सिर्फ एक लाइन में फाइलनाम और एक्सटेंशन दोनों प्राप्त करने के लिए सबसे सरल तरीका है ।

fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')

>>> print(fName)
Flower
>>> print(ext)
jpeg

अन्य समाधानों के विपरीत, आपको इसके लिए किसी भी पैकेज को आयात करने की आवश्यकता नहीं है।


2
यह सभी फाइलों या प्रकारों के लिए काम नहीं करता है उदाहरण के लिए '
ark.tar.gz

0

फ़ंसीज़ के लिए ... बस एक तानाशाही में एक्सटेंशन इकट्ठा करें, और उन सभी को एक फ़ोल्डर में ट्रैक करें। फिर अपने इच्छित एक्सटेंशन को खींचें।

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)

यह एक भयानक विचार है। आपका कोड किसी भी फ़ाइल एक्सटेंशन के लिए टूट जाता है जिसे आपने पहले नहीं जोड़ा है!
रॉबर्ट

0

इसे इस्तेमाल करे:

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
  1. सूची के अंदर सभी फ़ाइल नाम प्राप्त करें
  2. फ़ाइल नाम को विभाजित करना और लिंग विस्तार की जांच करना, क्या यह pen_ext सूची में है या नहीं?
  3. यदि हाँ, तो इसे अंतिम एक्सटेंशन में शामिल करें और इसे फ़ाइल के एक्सटेंशन के रूप में सेट करें
  4. यदि नहीं, तो फ़ाइल के एक्सटेंशन के रूप में अंतिम एक्सटेंशन डालें
  5. और फिर इसे देखें

1
यह विशेष मामलों के एक समूह के लिए टूट जाता है। स्वीकृत उत्तर देखें। यह पहिया को सुदृढ़ कर रहा है, केवल एक छोटी गाड़ी में।
रॉबर्ट

मैंने अपना जवाब अपडेट किया
इब्नुल हुसैन

नमस्कार! हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और संभवत: अधिक वोटों का परिणाम होगा। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
ब्रायन

@ ब्रायन ऐसा?
इब्नुल हुसैन

आप इसे केवल बदतर बना रहे हैं, इसे नए तरीकों से तोड़ रहे हैं। foo.tarएक मान्य फ़ाइल नाम है। अगर मैं आपके कोड पर इसे फेंक दूं तो क्या होगा? किस बारे में .bashrcया foo? एक कारण के लिए एक पुस्तकालय समारोह है ...
रॉबर्ट

-2
# 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 ""

-3
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

-5
name_only=file_name[:filename.index(".")

यह आपको पहले "।" तक फ़ाइल नाम देगा, जो सबसे आम होगा।


1
सबसे पहले, उसे नाम नहीं, बल्कि विस्तार की आवश्यकता है। दूसरा, भले ही उसे नाम की आवश्यकता हो, यह फाइलों की तरह गलत होगा:file.name.ext
ya_dimon

जैसा कि @ya_dimon ने उल्लेख किया है, यह डॉट्स के साथ फाइलों के नामों के लिए काम नहीं करेगा। इसके अलावा, वह विस्तार की जरूरत है!
उमर दस्तगीर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.