2010-04-18 12 views
9

मेरे पास कई स्क्रिप्ट हैं जो एक निर्देशिका नाम इनपुट के रूप में लेते हैं, और मेरा प्रोग्राम उन निर्देशिकाओं में फ़ाइलों को बनाता है। कभी-कभी मैं प्रोग्राम को दी गई निर्देशिका का बेसनाम लेना चाहता हूं और निर्देशिका में विभिन्न फाइलें बनाने के लिए इसका उपयोग करना चाहता हूं। उदाहरण के लिए,पायथन में निर्देशिका के बेसनाम लेने का सुरुचिपूर्ण तरीका?

# directory name given by user via command-line 
output_dir = "..." # obtained by OptParser, for example 
my_filename = output_dir + '/' + os.path.basename(output_dir) + '.my_program_output' 
# write stuff to my_filename 

समस्या यह है कि उपयोगकर्ता स्लैश के साथ एक निर्देशिका का नाम देता है, तो os.path.basename रिक्त स्ट्रिंग वापस आ जाएगी, जो कि मैं क्या नहीं करना चाहता है। पायथन में इन स्लैश/पिछला स्लैश मुद्दों से निपटने का सबसे शानदार तरीका क्या है? मुझे पता है कि मैं output_dir के अंत में स्लैश के लिए मैन्युअल रूप से जांच सकता हूं और अगर वहां है तो इसे हटा दें, लेकिन ऐसा लगता है कि एक बेहतर तरीका होना चाहिए। है?

साथ ही, मैन्युअल रूप से '/' अक्षर जोड़ने के लिए ठीक है? जैसे output_dir + '/' os.path.basename() या पथ बनाने के लिए एक और सामान्य तरीका है?

धन्यवाद।

उत्तर

15

अपने "पिछला स्लैश" समस्या (और अन्य मुद्दों!) से निपटने के लिए, os.path.normpath() के साथ उपयोगकर्ता इनपुट को स्वच्छ करें।

पथों का चयन करने के लिए, का उपयोग os.path.join()

1

मैन्युअल रूप से पथ बनाना, पोर्टेबिलिटी के लिए एक बुरा विचार है; यह विंडोज़ पर टूट जाएगा। आपको os.path.sep का उपयोग करना चाहिए।

os.path.join का उपयोग करके, आपके पहले प्रश्न के लिए सही विचार है।

+1

"" "" "यह Windows पर टूट जाएगा": सहित स्लैश केवल यदि आप जैसे के लिए एक आदेश के हिस्से के रूप में यह फ़ीड टूट जाएगा 'Os.system()'; डॉस कमांड पार्सर केवल बैकस्लाश को समझता है। इसे उदाहरण के लिए फ़ीड करना खुला() काफी ठीक है। हालांकि यदि विंडोज उपयोगकर्ता या व्यवस्थापक को निर्मित पथ कभी प्रदर्शित किया जाना है, तो बहुत से फ्लाक के लिए तैयार रहें :-) –

7

पथ बनाने के लिए os.path.join() का उपयोग करें। उदाहरण के लिए:

>>> import os.path 
>>> path = 'foo/bar' 
>>> os.path.join(path, 'filename') 
'foo/bar/filename' 
>>> path = 'foo/bar/' 
>>> os.path.join(path, 'filename') 
'foo/bar/filename' 
1

रास्तों का निर्माण करने के बिना लेखन स्लैश इसका इस्तेमाल करने के लिए बेहतर है:

os.path.join(dir, subdir, file) 

आप विभाजक जोड़ने के लिए या विभाजक ओएस के independly पाने के लिए चाहते हैं, तो का उपयोग

os.sep 
+0

ओपी के रूप में कहा गया है, समस्या यह है कि यदि डी "mydir" है तो यह एक खाली स्ट्रिंग वापस कर देगा। –

+0

@Ofri: संबंधित अनुभाग समाप्त कर दिया गया है। – joaquin

2

आपको पथ जोड़ने के लिए os.path.join() का उपयोग करना चाहिए।

उपयोग

os.path.dirname(os.path.join(output_dir,'')) 

dirname को निकालने के लिए है, जबकि स्लैश जोड़ने अगर यह बाहर रखा गया था।

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