2012-09-26 18 views
12

मैं पाइथन सीख रहा हूं और मैंने अपनी स्क्रिप्ट में से एक के साथ कुछ अजीब देखा। ऐसा करने से एक छोटे से परीक्षण मैं इस समस्या की खोज की इस व्यवहार से उपजी:os.path.join तर्कों को दूर क्यों करता है?

>>> import os 
>>> os.path.join('a','b') 
'a/b' 
>>> os.path.join('a','/b') 
'/b' 

documentation जाँच हो रही है, यह है, वास्तव में, समारोह के डिजाइन:

os.path। में शामिल होने (path1[, Path2[ ... ]])

एक या अधिक पथ घटकों समझदारी से शामिल हों। यदि कोई घटक एक पूर्ण पथ है, तो पिछले सभी घटकों (विंडोज़ पर, पिछले ड्राइव अक्षर सहित, यदि कोई था) को फेंक दिया जाता है, और जारी रहता है। ...

मेरा प्रश्न why my script failed नहीं है, बल्कि क्यों समारोह इस तरह से डिजाइन किया गया था। मेरा मतलब है, कम से कम यूनिक्स पर, a//b सुरुचिपूर्ण नहीं होने पर पथ को नामित करने का एक स्वीकार्य तरीका है। इस तरह से डिजाइन क्यों डिजाइन किया गया था? क्या यह बताने का कोई तरीका है कि os.path.isabs() के साथ प्रत्येक पथ स्ट्रिंग का परीक्षण करने के लिए एक या अधिक पथ तत्वों को छोड़ दिया गया है?


जिज्ञासा से बाहर, मैं भी इस मामले की जाँच की है, जहां एक पथ घटक एक os.sep चरित्र में समाप्त होता है:

>>> os.path.join('a/','b') 
'a/b' 

अपेक्षा के अनुरूप काम करता है।

+0

एक आसान, यद्यपि सुरुचिपूर्ण, इसके लिए जांच करने का तरीका 'filename.lstrip ('/')' – voithos

+3

@voithos इसे 'filename.lstrip (os.sep)' बनाएं और यह अधिकांश प्रमुख प्लेटफ़ॉर्म पर पोर्टेबल है। – delnan

+0

@ डेलनान: आपको विंडोज़ पर परीक्षण करना होगा, जहां यह 'os.sep +'/'' –

उत्तर

14

एक मामला जहां os.path.join('a', '/b') के लिए उपयोगी है /b वापस करने के लिए यदि आप किसी फ़ाइल नाम के लिए उपयोगकर्ता से पूछें तो होगा।

उपयोगकर्ता वर्तमान निर्देशिका के पथ रिश्तेदार या तो, या पूरा पथ, और अपने कार्यक्रम इस तरह दोनों ही मामलों को संभाल सकता दर्ज कर सकते हैं:

os.path.join(os.getcwd(), filename) 

In [54]: os.getcwd() 
Out[54]: '/tmp' 

In [55]: os.path.join(os.getcwd(), 'foo') 
Out[55]: '/tmp/foo' 

In [56]: os.path.join(os.getcwd(), '/foo/bar') 
Out[56]: '/foo/bar' 
+1

... या किसी अन्य निर्देशिका वास्तव में, यदि एप्लिकेशन के लिए एक समझदार डिफ़ॉल्ट निर्देशिका है। – delnan

+4

और गिडो को यह बहुत पहले [प्रथम संशोधन] (http://hg.python.org/cpython/file/5570dbb1ce55/Lib/posixpath.py#11) से दिमाग में था (जहां समारोह 'बिल्ली' के रूप में शुरू हुआ, बाद में 'शामिल' करने के लिए नामित किया जाएगा)। –

+0

@ मार्टिजन पीटर: यह बहुत दिलचस्प है। अगर ग्विडो ने कभी डिजाइन के पीछे उद्देश्य समझाया तो मैं उत्सुक हूं। और एक सार्थक उपयोग के मामले को इंगित करने के लिए unutbu धन्यवाद। –

1

लगता है कि तुम लिख रहे हैं cd की तरह एक उपयोगिता नई निर्देशिका की जाँच करने के लिए, आप

os.path.join(currdir, newdir) 

का प्रयोग करेंगे हमें तो er /b में प्रवेश करता है आप इसे पहले तर्क को फेंकने के अलावा छोड़ देंगे। यह वर्तमान निर्देशिका का उपयोग कर बहुत सारी चीज के लिए है।

संबंधित मुद्दे