पायथन में फ़ाइलपथ (एक निर्देशिका) का एक हिस्सा निकालें


162

मुझे एक निश्चित पथ के मूल निर्देशिका का नाम निकालने की आवश्यकता है। यह है जो ऐसा लग रहा है:

c:\stuff\directory_i_need\subdir\file

मैं "फ़ाइल" की सामग्री को कुछ के साथ संशोधित कर रहा हूं जो इसमें directory_i_needनाम का उपयोग करता है (पथ नहीं)। मैंने एक फ़ंक्शन बनाया है जो मुझे सभी फ़ाइलों की एक सूची देगा, और फिर ...

for path in file_list:
   #directory_name = os.path.dirname(path)   # this is not what I need, that's why it is commented
   directories, files = path.split('\\')

   line_replace_add_directory = line_replace + directories  
   # this is what I want to add in the text, with the directory name at the end 
   # of the line.

मैं उसे कैसे कर सकता हूँ?


1
आप इस उत्तर की जांच करना चाहते हैं: stackoverflow.com/a/4580931/311220
एकोर्न

उपरोक्त लिंक ने मुझे यह समझने में मदद की कि मैंने जो गलत किया उसे कैसे ठीक किया जाए। धन्यवाद।
थलिया

जवाबों:


237
import os
## first file in current dir (with full path)
file = os.path.join(os.getcwd(), os.listdir(os.getcwd())[0])
file
os.path.dirname(file) ## directory of file
os.path.dirname(os.path.dirname(file)) ## directory of directory of file
...

और आप यह करना जारी रख सकते हैं जितनी बार आवश्यक ...

संपादित करें: से os.path , आप या तो os.path.split या os.path.basename उपयोग कर सकते हैं:

dir = os.path.dirname(os.path.dirname(file)) ## dir of dir of file
## once you're at the directory level you want, with the desired directory as the final path node:
dirname1 = os.path.basename(dir) 
dirname2 = os.path.split(dir)[1] ## if you look at the documentation, this is exactly what os.path.basename does.

यह पथ के कुछ हिस्सों को निकालता है - लेकिन मुझे नहीं पता कि पथ से वास्तविक निर्देशिका नाम कैसे निकाला जाए।
थलिया

43

पायथन 3.4 में आप पाथलिब मॉड्यूल का उपयोग कर सकते हैं :

>>> from pathlib import Path
>>> p = Path('C:\Program Files\Internet Explorer\iexplore.exe')
>>> p.name
'iexplore.exe'
>>> p.suffix
'.exe'
>>> p.root
'\\'
>>> p.parts
('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')
>>> p.relative_to('C:\Program Files')
WindowsPath('Internet Explorer/iexplore.exe')
>>> p.exists()
True

एपीआई का अच्छा प्रदर्शन
नादिम फरहत

यह भी पायथन के पुराने संस्करणों को वापस भेज
फीनिक्स

11

parentयदि आप उपयोग करते हैं, तो आप सभी की जरूरत है pathlib

from pathlib import Path
p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parent) 

उत्पादन होगा:

C:\Program Files\Internet Explorer    

प्रकरण आप सभी भागों (पहले से ही अन्य उत्तर में कवर) उपयोग की जरूरत है parts:

p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parts) 

फिर आपको एक सूची मिलेगी:

('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')

समय की बचत होती है।


5

पहले, देखें कि क्या आपके पास splitunc()उपलब्ध फ़ंक्शन के रूप में है os.path। वापस किया गया पहला आइटम वही होना चाहिए जो आप चाहते हैं ... लेकिन मैं लिनक्स पर हूं और आयात करते समय मेरे पास यह फ़ंक्शन नहीं हैos और इसका उपयोग करने का प्रयास ।

अन्यथा, एक अर्द्ध बदसूरत तरीका है कि काम हो जाता है का उपयोग करने के लिए है:

>>> pathname = "\\C:\\mystuff\\project\\file.py"
>>> pathname
'\\C:\\mystuff\\project\\file.py'
>>> print pathname
\C:\mystuff\project\file.py
>>> "\\".join(pathname.split('\\')[:-2])
'\\C:\\mystuff'
>>> "\\".join(pathname.split('\\')[:-1])
'\\C:\\mystuff\\project'

जो फ़ाइल के ठीक ऊपर निर्देशिका को दिखाता है, और उसके ठीक ऊपर की निर्देशिका।


मैंने अपनी प्रविष्टि को rsplit के उपयोग को दिखाने के लिए संपादित किया, जो कि आपको क्या सुझाव देता है - लेकिन फिर भी मुझे केवल निर्देशिका नाम ही नहीं देता है।
थलिया

1
मैं अभी भी स्पष्ट नहीं कर रहा हूं कि आप क्या पूछ रहे हैं। आप \\ की अगली उच्च आवृत्ति के बाईं ओर सब कुछ पट्टी क्यों नहीं करते? जैसे आप रास्ता चाहते हैं, वैसे ही आगे बढ़ें, उसके बाद ही अंतिम प्रविष्टि रखें, जब आप इसे \\ पर विभाजित करें। यह काम करना चाहिए, नहीं?
ईली

मैंने पथ को विभाजित करना और मेरे द्वारा वांछित टुकड़ा लेना समाप्त कर दिया, यह पहले काम नहीं करता था लेकिन इन सभी उत्तरों को पढ़ने के बाद, मुझे पता चला कि मैंने क्या गलत किया है।
थलिया

यदि उत्तरों को पढ़ने से आपको मदद मिली, तो कम से कम अप-वोटिंग पर विचार करें, और संभवतः उनमें से एक को स्वीकार करें। मुझे खुशी है कि आपने हालांकि त्रुटि देखी है।
ईली

मुझे यह अर्ध-कुरूप तरीका काम करने का तरीका पसंद है। मैं एक साधारण os.sep द्वारा "\\" बदल देता हूं और यह पूरी तरह से एक पथ के कुछ अंश को पुनः प्राप्त करने के लिए काम करता है।
तजार्गो

1

यह वही है जो मैंने निर्देशिका के टुकड़े को निकालने के लिए किया था:

for path in file_list:
  directories = path.rsplit('\\')
  directories.reverse()
  line_replace_add_directory = line_replace+directories[2]

आपके सहयोग के लिए धन्यवाद।


0
import os

directory = os.path.abspath('\\') # root directory
print(directory) # e.g. 'C:\'

directory = os.path.abspath('.') # current directory
print(directory) # e.g. 'C:\Users\User\Desktop'

parent_directory, directory_name = os.path.split(directory)
print(directory_name) # e.g. 'Desktop'
parent_parent_directory, parent_directory_name = os.path.split(parent_directory)
print(parent_directory_name) # e.g. 'User'

यह चाल भी चलनी चाहिए।


-1

आपको पूरा रास्ता एक पैरामीटर के रूप में os.path.split पर रखना होगा। डॉक्स देखें । यह स्ट्रिंग विभाजन की तरह काम नहीं करता है।


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