पायथन में फ़ाइल नाम से एक्सटेंशन कैसे बदलें (या पट्टी)?


112

क्या पायथन में एक अंतर्निहित कार्य है जो एक फ़ाइल नाम के विस्तार (या जो भी हो) को हटा देगा (यदि यह एक है)?

उदाहरण:

print replace_extension('/home/user/somefile.txt', '.jpg')

मेरे उदाहरण में: /home/user/somefile.txtबन जाएगा/home/user/somefile.jpg

मैं नहीं जानता कि क्या यह मायने रखता है, लेकिन मुझे इसकी ज़रूरत है कि मैं लिख रहा हूँ एक SCOS मॉड्यूल के लिए। (तो शायद कुछ SCons विशिष्ट फ़ंक्शन मैं उपयोग कर सकता है?)

मुझे कुछ साफ चाहिए । स्ट्रिंग के .txtभीतर होने वाली सभी घटनाओं का एक सरल स्ट्रिंग प्रतिस्थापन करना स्पष्ट रूप से साफ नहीं है। (अगर मेरा फ़ाइल नाम है तो यह विफल हो जाएगा somefile.txt.txt.txt)



स्कैन एक्शन स्ट्रिंग में फाइलबेस पर प्राप्त करने की अनुमति देता है। क्या आप अपने स्कोन्स को विशिष्ट तर्क पोस्ट कर सकते हैं, जिन्हें इसकी आवश्यकता है? क्या यह एक्शन, एमिटर, स्कैनर के लिए है?
bdbaddog

कुछ इस तरह से काम करने के लिए प्रतीत नहीं होता है क्योंकि पथ पॉज़िक्सपथ रिटर्न देता है न कि एक स्ट्रिंग: पी
शिगेटा

जवाबों:


146

Os.path.splitext आज़माएं यह वही करना चाहिए जो आप चाहते हैं।

import os
print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg'

15
@ एस.लॉट: मेरा विश्वास करो या नहीं। पर मैने किया। मैं हमेशा करता हॅू। शायद गलत शब्दों के साथ।
ereOn

@ereOn: चूँकि आपका प्रश्न लगभग एक ही प्रकार के वाक्यांशों का उपयोग करता है, इसलिए मैं थोड़ा आश्चर्यचकित हूँ कि आपको यह नहीं मिला। आपके प्रश्न में 5 शब्द हैं - एक पंक्ति में - जो सटीक मेल खाता है।
S.Lott 16

केवल साफ दिखने के लिए os.path.join के साथ नया नाम रखें।
टोनी वेजालिनेन

4
@ टोनी वीजलैनेन: आपको OS.path.join का उपयोग नहीं करना चाहिए क्योंकि यह ओएस-विशिष्ट पथ विभाजक के साथ पथ घटकों में शामिल होने के लिए है। उदाहरण के लिए, print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')वापस आ जाएगा /home/user/somefile/.jpg, जो वांछनीय नहीं है।
scottclowe

@ एस.लॉट - 99 लोग इस जवाब को अप-वोट करते हैं, इसका साफ मतलब है कि यह पोस्ट मददगार है, ऑल-कैप
शेमिंग

92

एनापाना के जवाब पर विस्तार करते हुए कि कैसे पाथलिब (पायथन> = 3.4) का उपयोग करके एक्सटेंशन को हटाया जाए :

>>> from pathlib import Path

>>> filename = Path('/some/path/somefile.txt')

>>> filename_wo_ext = filename.with_suffix('')

>>> filename_replace_ext = filename.with_suffix('.jpg')

>>> print(filename)
/some/path/somefile.ext    

>>> print(filename_wo_ext)
/some/path/somefile

>>> print(filename_replace_ext)
/some/path/somefile.jpg

1
रियल पायथन में पथलिब मॉड्यूल के उदाहरण उपयोग मामलों का एक अच्छा लेखन है: realpython.com/python-pathlib
स्टीवन सी। हॉवेल

2
यह उत्तर मेरा विशिष्ट दृष्टिकोण है, लेकिन यह तब विफल होता है जब आपके पास कई फ़ाइल एक्सटेंशन होते हैं। उदाहरण के लिए, pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))आउटपुट देगा 'data/foo.tar.jpg'। मुझे लगता है कि आप कर सकते हैं pth.with_suffix('').with_suffix('.jpg'), लेकिन यह क्लूनी है, और आपको एक फ़ाइल एक्सटेंशन में .with_suffix('')डॉट्स की एक मनमानी संख्या से निपटने के लिए कॉल की एक मनमाने ढंग से लंबी श्रृंखला को जोड़ने की आवश्यकता होगी .(वास्तव में, 2 से अधिक एक विदेशी बढ़त मामला है)।
टेल

@tel आप एक इस्तेमाल कर सकते हैं while: हल करने के लिए है कि पाशpth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
dericke

एकाधिक एक्सटेंशन समस्या के समाधान के लिए नीचे मेरा उत्तर देखें ।
माइकल हॉल

33

जैसा कि @ जेथ्रो ने कहा, splitextयह करने का सबसे साफ तरीका है। लेकिन इस मामले में, अपने आप को विभाजित करना बहुत आसान है, क्योंकि अंतिम अवधि के बाद विस्तार फ़ाइल नाम का हिस्सा होना चाहिए :

filename = '/home/user/somefile.txt'
print( filename.rsplit( ".", 1 )[ 0 ] )
# '/home/user/somefile'

rsplitअजगर बताता स्ट्रिंग के अधिकार से शुरू स्ट्रिंग विभाजन प्रदर्शन करने के लिए, और 1सबसे एक विभाजन पर प्रदर्शन करने का कहना है (ताकि जैसे 'foo.bar.baz'-> [ 'foo.bar', 'baz' ])। चूंकि rsplitहमेशा एक गैर-खाली सरणी वापस आ जाएगी, हम 0फ़ाइल नाम को एक्सटेंशन प्राप्त करने के लिए सुरक्षित रूप से इसमें अनुक्रमित कर सकते हैं ।


8
ध्यान दें कि उपयोग करने से rsplitउन फ़ाइलों के लिए अलग-अलग परिणाम होंगे जो एक डॉट के साथ शुरू होते हैं और कोई अन्य एक्सटेंशन नहीं है (जैसे लिनक्स पर छिपी हुई फाइलें, जैसे .bashrc)। os.path.splitextइनके लिए एक खाली एक्सटेंशन देता है, लेकिन उपयोग rsplitकरने से पूरे फ़ाइलनाम को एक एक्सटेंशन माना जाएगा।
फ्लोरियन ब्रकर

4
यह फाइलनाम के लिए अप्रत्याशित परिणाम भी देगा/home/john.johnson/somefile
विल मैनले

7

मैं str.rsplit () का उपयोग करते हुए निम्नलिखित एक-लाइनर दृष्टिकोण को पसंद करता हूं :

my_filename.rsplit('.', 1)[0] + '.jpg'

उदाहरण:

>>> my_filename = '/home/user/somefile.txt'
>>> my_filename.rsplit('.', 1)
>>> ['/home/user/somefile', 'txt']

2
यह विफल हो जाता है यदि किसी व्यक्ति के पास कोई एक्सटेंशन नहीं है और उपयोगकर्ता 'john.doe' है।
मारेक जेडलीस्की

क्या वे सभी असफल नहीं होंगे?
eatmeimadanish

6

पायथन के लिए> = 3.4:

from pathlib import Path

filename = '/home/user/somefile.txt'

p = Path(filename)
new_filename = p.parent.joinpath(p.stem + '.jpg') # PosixPath('/home/user/somefile.jpg')
new_filename_str = str(new_filename) # '/home/user/somefile.jpg'

1
मुझे लगता है कि जेएस द्वारा सुझाया गया पैथलिब दृष्टिकोण। बहुत सरल है।
h0b0

4

कई एक्सटेंशन को संभालना

इस मामले में जहां आपके पास एक-लाइनर का उपयोग करने के लिए कई एक्सटेंशन हैं pathlibऔर str.replaceएक उपचार का काम करता है:

एक्सटेंशन निकालें / पट्टी करें

>>> from pathlib import Path
>>> p = Path("/path/to/myfile.tar.gz")
>>> str(p).replace("".join(p.suffixes), "")
'/path/to/myfile'

एक्सटेंशन बदलें

>>> p = Path("/path/to/myfile.tar.gz")
>>> new_ext = ".jpg"
>>> str(p).replace("".join(p.suffixes), new_ext)
'/path/to/myfile.jpg'

यदि आप भी एक pathlibऑब्जेक्ट आउटपुट चाहते हैं तो आप स्पष्ट रूप से लाइन को अंदर लपेट सकते हैंPath()

>>> Path(str(p).replace("".join(p.suffixes), ""))
PosixPath('/path/to/myfile')

एक समारोह में यह सब लपेटकर

from pathlib import Path
from typing import Union

PathLike = Union[str, Path]


def replace_ext(path: PathLike, new_ext: str = "") -> Path:
    extensions = "".join(Path(path).suffixes)
    return Path(str(p).replace(extensions, new_ext))


p = Path("/path/to/myfile.tar.gz")
new_ext = ".jpg"

assert replace_ext(p, new_ext) == Path('/path/to/myfile.jpg')
assert replace_ext(str(p), new_ext) == Path('/path/to/myfile.jpg')
assert replace_ext(p) == Path('/path/to/myfile')

pathlib के लिए एक शॉर्टकट है: Path ()। with_suffix ("") एक एक्सटेंशन को हटा देगा और Path.with_suffix ("txt") इसे बदल देगा।
लेवी

सही बात। लेकिन यह केवल पहला एक्सटेंशन निकालता है। इसलिए उपरोक्त उदाहरण में, के with_suffixबजाय का उपयोग करके replaceकेवल मेरे उत्तर के .gzबजाय हटा .tar.gzदिया जाएगा "सामान्य" होने का इरादा था, लेकिन अगर आप केवल एक विस्तार की उम्मीद करते हैं, with_suffixतो एक क्लीनर समाधान होगा।
माइकल हॉल

3

str.rpartition(sep)विधि का उपयोग करने का एक और तरीका है।

उदाहरण के लिए:

filename = '/home/user/somefile.txt'
(prefix, sep, suffix) = filename.rpartition('.')

new_filename = prefix + '.jpg'

print new_filename
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.