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


994

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

जवाबों:


1314

एक्सटेंशन के बिना फ़ाइल का नाम प्राप्त करना:

import os
print(os.path.splitext("/path/to/some/file.txt")[0])

प्रिंटों:

/path/to/some/file

के लिए प्रलेखनos.path.splitext

महत्वपूर्ण नोट: यदि फ़ाइल नाम में कई डॉट्स हैं, तो केवल पिछले एक को हटाने के बाद एक्सटेंशन। उदाहरण के लिए:

import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])

प्रिंटों:

/path/to/some/file.txt.zip

यदि आपको उस मामले को संभालने की आवश्यकता है, तो नीचे दिए गए अन्य उत्तर देखें।


13
यदि यह एक सामान्य पर्याप्त ऑपरेशन है, तो शायद यह योग्यता होनी चाहिए कि यह स्वयं आधिकारिक आदेश है? Os.path.splitext (os.path.basename (path_to_file)) [0] के बजाय os.path.filename (path_to_file) की तरह कुछ
Fnord

19
क्या होगा अगर फ़ाइल नाम में कई डॉट्स हैं?
मत्तीटोक

100
किसी के लिए भी मैटटेक की तरह ही सोच रहे हैं, अगर कई डॉट्स हैं, तो पिछले एक पर स्प्लिटेक्स विभाजन होता है (इसलिए splitext('kitty.jpg.zip')देता है ('kitty.jpg', '.zip'))।
चक

50
ध्यान दें कि यह कोड संपूर्ण फ़ाइल पथ (विस्तार के बिना) देता है, न कि केवल फ़ाइल नाम
अरन-फे

2
हाँ, इसलिए आपको ऐसा करना होगा splitext(basename('/some/path/to/file.txt'))[0](जो मैं हमेशा कर रहा
हूं

531

आप अपना खुद का बना सकते हैं:

>>> import os
>>> base=os.path.basename('/root/dir/sub/file.ext')
>>> base
'file.ext'
>>> os.path.splitext(base)
('file', '.ext')
>>> os.path.splitext(base)[0]
'file'

महत्वपूर्ण नोट: यदि .फ़ाइल नाम में एक से अधिक है , तो केवल पिछले एक को हटा दिया जाता है। उदाहरण के लिए:

/root/dir/sub/file.ext.zip -> file.ext

/root/dir/sub/file.ext.tar.gz -> file.ext.tar

नीचे दिए गए अन्य उत्तरों के लिए नीचे देखें कि पता।


2
@ScottWilson: आपको अभी भी आयात करना osहै।
लार्श

35
Roll रोल इट ’का क्या अर्थ है?
लार्श

49
यह अमेरिकी अंग्रेजी में "अपने खुद के रोल" के लिए छोटा है, जिसका अर्थ है "इसे स्वयं बनाएं"।
स्कॉट सी विल्सन

1
@ एलेन डब्ल्यू स्मिथ, "जस्ट रोल इट:" पिछले 10 वर्षों से पूरी तरह से ठीक काम कर रहा था। "कम अमेरिकी" का क्या अर्थ है? मैं आपके संपादन के पक्ष में नहीं हूं।
तर्क 1

4
संपादन इसे स्पष्ट करता है। हर किसी की पहली भाषा के रूप में अंग्रेजी नहीं होती है, इसलिए 'रोल
इट

327

pathlibपायथन 3.4+ में उपयोग करना

from pathlib import Path

Path('/root/dir/sub/file.ext').stem

वापस होगा

'file'

9
यह अजगर 3 के बाद से अनुशंसित तरीका है
मिलादियस

1
ध्यान दें कि, os.pathसमाधानों की तरह , यह केवल एक एक्सटेंशन (या suffix, जैसा कि pathlibकॉल करता है) को पट्टी करेगा । Path('a.b.c').stem == 'a.b'
बॉलपॉइंटबैन

@ बॉलपॉइंट पर कई प्रत्ययों को अलग करने का इष्टतम तरीका क्या है? निश्चित रूप से वहाँ से एक बेहतर तरीका होना चाहिएPath(Path('a.b.c').stem).stem
Hoan

1
@ मुझे लगता है कि बार-बार फोन .with_suffix('')करना ही जाने का रास्ता है। आप शायद तब तक लूप करना चाहेंगे p.suffix == ''
बॉलपॉइंटबैन

218
>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth

7
इसके लिए +1। 3 सटीक उत्तर, लेकिन यह सबसे प्रत्यक्ष है। आप बस `कोड दिखाने के लिए इस्तेमाल कर सकते थे , और "/somepath/hermanth.txt" एक पथ उदाहरण के रूप में।
cregox

2
@ hemanth.hm ध्यान दें कि आपके द्वारा दिए गए इस कथन में, os.path.basenameआवश्यक नहीं है। os.path.basenameकेवल फ़ाइल पथ से फ़ाइल नाम प्राप्त करने के लिए उपयोग किया जाना चाहिए।
arrt_

74

पायथन 3.4+ में आप pathlibसमाधान का उपयोग कर सकते हैं

from pathlib import Path

print(Path(your_path).resolve().stem)

4
आप resolve()रास्ता क्यों बनाते हैं? क्या किसी फ़ाइल के लिए पथ प्राप्त करना संभव है और क्या फ़ाइल नाम उसके बिना पथ का हिस्सा नहीं है? इसका मतलब यह है कि यदि आप सिमिलिंक को एक रास्ता दे रहे हैं, तो आप फाइल का नाम (विस्तार के बिना) सिम्लिंक को लौटा देंगे।
बोरिस

1
उपयोग करने का एक संभावित कारण resolve()कई डॉट्स समस्या से निपटने में मदद करना है। सूचकांक का उपयोग करने के बारे में नीचे दिए गए उत्तर से काम नहीं चलेगा यदि पथ './foo.tar.gz' है
विलियम

30

https://docs.python.org/3/library/os.path.html

अजगर 3 पैथलिब में "पैथलिब मॉड्यूल उच्च-स्तरीय पथ ऑब्जेक्ट प्रदान करता है।" इसलिए,

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c

1
एक पूर्ण पथ से विस्तार को हटाने के सामान्य मामले के लिए यह सबसे अच्छा पायथन 3 समाधान है। स्टेम का उपयोग करने से मूल पथ भी निकल जाता है। यदि आप दोहरे विस्तार की उम्मीद कर रहे हैं (जैसे bla.tar.gz) तो आप इसे दो बार भी उपयोग कर सकते हैं: p.with_suffix ('')। With_suffix ('')।
इल्को वैन Vliet

24

यदि आप फ़ाइल में पथ रखना चाहते हैं और एक्सटेंशन को हटा दें

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2

16
यदि आप अंतिम अवधि में विभाजन करना चाहते हैं, तो rsplit का उपयोग करें:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor

21

यदि एक्सटेंशन में कई डॉट्स हैं, तो os.path.splitext () काम नहीं करेगा

उदाहरण के लिए, images.tar.gz

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> print os.path.splitext(file_name)[0]
images.tar

आप बस बेसनेम में पहले डॉट का इंडेक्स ढूंढ सकते हैं और फिर बिना विस्तार के सिर्फ फाइलनेम पाने के लिए बेसन को स्लाइस कर सकते हैं।

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> index_of_dot = file_name.index('.')
>>> file_name_without_extension = file_name[:index_of_dot]
>>> print file_name_without_extension
images

1
index_of_dot = file_name.index ('।') यह फ़ाइल के बेसनेम को प्राप्त करने के बाद किया जाएगा ताकि यह .env
Dheeraj Chakravarthi

2
महत्वपूर्ण बिंदु, इस तरह के विस्तार की एक श्रृंखला के रूप में आम है। .tar.gz .tar.bz .tar.7z

2
ध्यान दें कि 'haystack'.index('needle')यदि सुई (ऊपर के मामले में डॉट .) हैस्टैक में नहीं पाई जाती है , तो मान मान अपवाद को फेंकता है । बिना एक्सटेंशन वाली फाइलें भी मौजूद हैं।
Czechnology

15

@ Ice2or ने @ user2902201 के समाधान के लिए एक टिप्पणी में rsplit को संदर्भित किया है। rsplit सबसे सरल समाधान है जो कई अवधियों का समर्थन करता है।

यहाँ यह वर्तनी है:

file = 'my.report.txt'
print file.rsplit('.', 1)[0]

मेरी रिपोर्ट


13

लेकिन जब मैं ओएस आयात करता हूं, तब भी मैं इसे path.basename नहीं कह सकता। क्या इसे सीधे बेसन के रूप में कॉल करना संभव है?

import os, और फिर उपयोग करें os.path.basename

importआईएनजी का osमतलब यह नहीं है कि आप का os.fooउल्लेख किए बिना उपयोग कर सकते हैं os


1
हालांकि अगर आप फू को सीधे कॉल करना चाहते हैं तो आप उपयोग कर सकते हैं from os import foo
त्रिग्रे

आपके पास osमॉड्यूल का एक बहुत ही गैर-मानक संस्करण है यदि इसमें एक सदस्य है जिसे बुलाया गया है foo
ताडग मैकडोनाल्ड-जेन्सेन

2
यह एक प्लेसहोल्डर नाम है। (उदाहरण पर विचार करें path, या walk)।
डेविन जीनपिएरे

13

सोचा था कि मैं अनुक्रमणिका का उपयोग करने की आवश्यकता के बिना os.path.splitext के उपयोग के लिए भिन्नता में फेंक दूंगा

फ़ंक्शन हमेशा एक (root, ext)जोड़ी देता है ताकि इसका उपयोग करना सुरक्षित हो:

root, ext = os.path.splitext(path)

उदाहरण:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'

os.path.splittext () संस्करण 3.6+ है
यज़ीम रामिरेज़

6

अन्य विधियां कई एक्सटेंशन नहीं निकालती हैं। कुछ में फ़ाइल नाम की समस्याएं भी होती हैं, जिनमें एक्सटेंशन नहीं होते हैं। यह स्निपेट पायथन 2 और 3 दोनों में उदाहरणों के साथ काम करता है। 3. यह पथ से बेसन को पकड़ता है, डॉट्स पर मूल्य को विभाजित करता है, और पहले वाले को रिटर्न करता है जो फ़ाइल नाम का प्रारंभिक भाग है।

import os

def get_filename_without_extension(file_path):
    file_basename = os.path.basename(file_path)
    filename_without_extension = file_basename.split('.')[0]
    return filename_without_extension

यहां चलाने के लिए उदाहरणों का एक सेट है:

example_paths = [
    "FileName", 
    "./FileName",
    "../../FileName",
    "FileName.txt", 
    "./FileName.txt.zip.asc",
    "/path/to/some/FileName",
    "/path/to/some/FileName.txt",
    "/path/to/some/FileName.txt.zip.asc"
]

for example_path in example_paths:
    print(get_filename_without_extension(example_path))

हर मामले में, मुद्रित मूल्य है:

FileName

कई डॉट्स को संभालने के अतिरिक्त मूल्य को छोड़कर, यह विधि तरीका अधिक तेज है Path('/path/to/file.txt').stem। (1,23μs बनाम 8.39μs)
raratiru

यह फ़ाइल नाम nvdcve-1.1-2002.json.zip के लिए काम नहीं करता है
मिशेल

मैंने इसे fileBasename.split ('। Json') [0] पर विभाजित किया और इसने काम किया
मिशेल

4

import os

filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv

यह filenameबिना extension(C: \ Users \ Public \ Videos \ नमूना वीडियो \ वन्यजीव) देता है

temp = os.path.splitext(filename)[0]  

अब आप बस के filenameसाथ अस्थायी से प्राप्त कर सकते हैं

os.path.basename(temp)   #this returns just the filename (wildlife)

3

एक से अधिक विस्तार जागरूक प्रक्रिया। के लिए काम करता है strऔर unicodeपथ। अजगर 2 और 3 में काम करता है।

import os

def file_base_name(file_name):
    if '.' in file_name:
        separator_index = file_name.index('.')
        base_name = file_name[:separator_index]
        return base_name
    else:
        return file_name

def path_base_name(path):
    file_name = os.path.basename(path)
    return file_base_name(file_name)

व्यवहार:

>>> path_base_name('file')
'file'
>>> path_base_name(u'file')
u'file'
>>> path_base_name('file.txt')
'file'
>>> path_base_name(u'file.txt')
u'file'
>>> path_base_name('file.tar.gz')
'file'
>>> path_base_name('file.a.b.c.d.e.f.g')
'file'
>>> path_base_name('relative/path/file.ext')
'file'
>>> path_base_name('/absolute/path/file.ext')
'file'
>>> path_base_name('Relative\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('C:\\Absolute\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('/path with spaces/file.ext')
'file'
>>> path_base_name('C:\\Windows Path With Spaces\\file.txt')
'file'
>>> path_base_name('some/path/file name with spaces.tar.gz.zip.rar.7z')
'file name with spaces'


0

विंडोज सिस्टम पर मैंने ड्राइवरनेम उपसर्ग का इस्तेमाल किया, जैसे:

>>> s = 'c:\\temp\\akarmi.txt'
>>> print(os.path.splitext(s)[0])
c:\temp\akarmi

इसलिए क्योंकि मुझे ड्राइव अक्षर या निर्देशिका नाम की आवश्यकता नहीं है, मैं उपयोग करता हूं:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi

0

सुविधा के लिए, दो विधियों को लपेटने वाला एक सरल कार्य os.path:

def filename(path):
  """Return file name without extension from path.

  See https://docs.python.org/3/library/os.path.html
  """
  import os.path
  b = os.path.split(path)[1]  # path, *filename*
  f = os.path.splitext(b)[0]  # *file*, ext
  #print(path, b, f)
  return f

पायथन 3.5 के साथ परीक्षण किया गया।



0

बहुत बहुत simpely कोई अन्य मॉड्यूल !!!

import os
p = r"C:\Users\bilal\Documents\face Recognition python\imgs\northon.jpg"

# Get the filename only from the initial file path.
filename = os.path.basename(p)

# Use splitext() to get filename and extension separately.
(file, ext) = os.path.splitext(filename)

# Print outcome.
print("Filename without extension =", file)
print("Extension =", ext)

-1

हम कुछ सरल split/ popजादू कर सकते हैं जैसा कि यहाँ देखा गया है ( https://stackoverflow.com/a/424006/1250044 ), फ़ाइल नाम निकालने के लिए (विंडोज़ और POSIX अंतर का सम्मान करते हुए)।

def getFileNameWithoutExtension(path):
  return path.split('\\').pop().split('/').pop().rsplit('.', 1)[0]

getFileNameWithoutExtension('/path/to/file-0.0.1.ext')
# => file-0.0.1

getFileNameWithoutExtension('\\path\\to\\file-0.0.1.ext')
# => file-0.0.1

os.path.splitext () [0] वही काम करता है।
चार्ल्स प्लेजर

यदि एक्सटेंशन में कई डॉट्स हैं, तो @CharlesPlager os.path.splitext () काम नहीं करेगा। stackoverflow.com/a/37760212/1250044
yckart

यह मेरे लिए काम करता है: [:२] में: os.path.splitext ('one.two.three.ext') आउट [72]: ('one.two.three', '.ext')
चार्ल्स प्लेजर

-1
import os
list = []
def getFileName( path ):
for file in os.listdir(path):
    #print file
    try:
        base=os.path.basename(file)
        splitbase=os.path.splitext(base)
        ext = os.path.splitext(base)[1]
        if(ext):
            list.append(base)
        else:
            newpath = path+"/"+file
            #print path
            getFileName(newpath)
    except:
        pass
return list

getFileName("/home/weexcel-java3/Desktop/backup")
print list

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