2012-11-19 12 views
5

मैं पाइथन में विंडोज के लिए एक कमांड लाइन निर्देशिका नेविगेटर लिख रहा हूं और os.path.join के साथ थोड़ा संघर्ष कर रहा हूं। यहाँ संक्षेप में, है, मैं क्या करने की कोशिश कर रहा हूँ: 'सी' और मैं बाहर क्यों समझ नहीं सकताos.path.join सही ढंग से स्वरूपण पथ

abspath = "C:\Python32\Projects\ls.py" 
abspath = abspath.split('\\') 
print(abspath) #this prints ['C:', 'Python32', 'Projects', 'ls.py'] 

if(options.mFlag): 
     print(os.path.join(*abspath)) #this prints C:Python32\Projects\ls.py 
     m = time.ctime(os.path.getmtime(os.path.join(*abspath))) #this throws an exception 

समस्या यह है कि os.path.join के बाद डालने नहीं है एक '/' है। कोई मदद?

संपादित करें: यदि भविष्य में कोई भी यहां समाधान ढूंढ रहा है, तो मैंने बैकस्लैश हार्डकोडिंग के बजाय "सी:" के बाद os.sep जोड़ा और यह काम किया।

उत्तर

6

the documentation से: (ग: foo), नहीं

ध्यान दें कि विंडोज पर, के बाद से वहाँ प्रत्येक ड्राइव के लिए एक मौजूदा निर्देशिका है, os.path.join("c:", "foo") ड्राइव C पर वर्तमान निर्देशिका के पथ रिश्तेदार का प्रतिनिधित्व करता है c: \ foo।

यह बताने के लिए आप क्या हासिल करना, के बाद से अपने सभी कोड लक्ष्य किए जाने पर पथ विभाजित और फिर इसे वापस एक साथ वास्तव में जिस तरह से यह था डाल करने के लिए है लगता है की कोशिश कर रहे एक छोटे से मुश्किल है, जिस स्थिति क्यों में इसे पहली जगह में विभाजित करें? लेकिन शायद os.path.splitdrive आपकी मदद करेगा? यह पथ से ड्राइव अक्षर विभाजित करता है।

+0

इस ब्लॉक का बिंदु प्रोग्राम मंच को स्वतंत्र बनाना है। इस फ़ंक्शन को सम्मिलित करने से पहले, कोड ओएसएक्स में ठीक से निष्पादित नहीं हो रहा था। टिप के लिए धन्यवाद, मैं splitdrive कोशिश करेंगे। – bkaiser

+0

@benjaminhkaiser: एक और चीज जो आप कर सकते हैं \ ''के बजाय पथ विभाजक के रूप में \ /' का उपयोग करें। यह अभी भी विंडोज पर काम करेगा लेकिन अन्य प्लेटफार्मों पर भी काम करेगा। – BrenBarn

+0

तो हम इसे स्लैश सही तरीके से जोड़ने के लिए कैसे प्राप्त करते हैं? 'os.path.join (os.getenv (" systemDrive "), 'somepath') '=='' सी: कुछपथ ' – endolith

3

डॉक्स (http://docs.python.org/2/library/os.path.html) इस व्यवहार को निर्दिष्ट करें: जो Windows पर, के बाद से वहाँ प्रत्येक ड्राइव के लिए एक मौजूदा निर्देशिका, os.path.join ("c:", "foo") है

नोट का प्रतिनिधित्व करता है ड्राइव सी पर वर्तमान निर्देशिका से संबंधित एक पथ: (सी: foo), नहीं c: \ foo।

+1

क्या कोई आसान फिक्स है या क्या मुझे मैन्युअल रूप से बैकस्लैश डालना चाहिए (या बस os.sep डालें)? मुझे लगता है कि os.path.join का उपयोग करने के उद्देश्य को हरा देगा। – bkaiser

+0

एक संभावित समाधान पथ को मैन्युअल रूप से विभाजित नहीं करना है, बल्कि 'os.path.split' का उपयोग करना है। यह ड्राइव अक्षर और रूट निर्देशिका के बीच से पहले '\' को सही ढंग से नहीं हटाएगा। – Blckknght

+0

@ बेंजामिनहकाइज़र: आप क्या करने की कोशिश कर रहे हैं? – BrenBarn

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