2008-10-08 10 views
5

मुझे पायथन पसंद है क्योंकि इसमें बैटरी शामिल हैं, और मैं अंतर्निहित कार्यों का उपयोग करता हूं, बहुत कुछ, मेरे लिए गंदी नौकरी करने के लिए।ओएसपाथ: क्या आप इस व्यवहार को समझा सकते हैं?

मैं हमेशा खुशी से os.path मॉड्यूल का उपयोग कर फ़ाइल पथ से निपटने के लिए, लेकिन हाल ही मैं उबंटू लिनक्स के तहत पायथन 2.5 पर अप्रत्याशित परिणाम के साथ समाप्त हो गया गया है, जबकि स्ट्रिंग के साथ काम है कि विंडोज़ फ़ाइल पथ का प्रतिनिधित्व करते हैं:

filepath = r"c:\ttemp\FILEPA~1.EXE" 
print os.path.basename(filepath) 
'c:\\ttemp\\FILEPA~1.EXE'] 
print os.path.splitdrive(filepath) 
('', 'c:\ttemp\\FILEPA~1.EXE') 

डब्ल्यूटीएफ?

यह फ़ाइलपैथ = यू "सी: \ ttemp \ FILEPA ~ 1.EXE" और filepath = "c: \ ttemp \ FILEPA ~ 1.EXE" के साथ उसी तरह समाप्त होता है।

क्या आपके पास कोई सुराग है? उबंटू यूटीएफ 8 का उपयोग करता है लेकिन मुझे ऐसा नहीं लगता कि इसमें इसके साथ कुछ करना है। हो सकता है कि मेरा पायथन इंस्टॉलेशन गड़बड़ हो गया है लेकिन मैंने उस पर कोई विशेष ट्विक नहीं किया है जिसे मैं याद कर सकता हूं।

+0

आप अपने स्वीकृत उत्तर की समीक्षा करना चाह सकते हैं - मोटो के एनटीपीएथ के संदर्भ को देखें, जो ऐसा करने का सही तरीका है। –

उत्तर

24

आप Windows रास्तों लिनक्स पर आप ntpath मॉड्यूल का उपयोग करना चाहिए हेरफेर करने के लिए चाहते हैं, तो (इस मॉड्यूल है कि खिड़कियों पर os.path के रूप में आयात किया जाता है - posixpath लिनक्स पर os.path के रूप में आयात किया जाता है)

>>> import ntpath 
>>> filepath = r"c:\ttemp\FILEPA~1.EXE" 
>>> print ntpath.basename(filepath) 
FILEPA~1.EXE 
>>> print ntpath.splitdrive(filepath) 
('c:', '\\ttemp\\FILEPA~1.EXE') 
+2

यह एक उत्कृष्ट उत्तर है जो स्वीकार्य एक, आईएमएचओ होने का हकदार है।अपने स्वयं के regexps शिल्प की तुलना में तैयार किए गए उपकरणों का उपयोग करना बेहतर है। Ntpath के लिए –

+1

+1; – efotinis

+0

करने के लिए यह सही बात है मेरा गोफ, यह शानदार है! –

3
एक os.path प्रलेखन से

:

os.path.splitdrive (पथ)
स्प्लिट को एक जोड़ी (ड्राइव, पूंछ) जहां ड्राइव या तो एक ड्राइव विनिर्देश या रिक्त स्ट्रिंग है में पथ पथ। उन सिस्टम पर जो ड्राइव विनिर्देशों का उपयोग नहीं करते हैं, ड्राइव हमेशा खाली स्ट्रिंग होगी। सभी मामलों में, ड्राइव + पूंछ पथ के समान ही होगा।

यदि आप इसे यूनिक्स पर चलाते हैं, तो यह ड्राइव विनिर्देशों का उपयोग नहीं करता है, इसलिए - ड्राइव खाली स्ट्रिंग होगी।

आप किसी भी मंच पर खिड़कियों रास्तों को हल करना चाहते हैं, तो आप सिर्फ एक सरल regexp का उपयोग कर सकते हैं:

import re 
(drive, tail) = re.compile('([a-zA-Z]\:){0,1}(.*)').match(filepath).groups() 

drive एक ड्राइव (। जैसे c:, u:) या None: द्वारा पीछा पत्र हो जाएगा, और tail पूरे आराम :)

+0

हाँ, बस यह महसूस करें कि: स्ट्रिंग प्रक्रिया ओएस पर आधारित है, सिंटैक्स पर नहीं। यह जीत और यूनिक्स पथ के बीच कोई फर्क नहीं पड़ता है, यह आपके प्लेटफ़ॉर्म के अनुसार एक अलग अलगो लागू करता है। बकवास। –

+0

नियमित अभिव्यक्तियों का उपयोग न करें, इसके बजाय ntpath मॉड्यूल का उपयोग करें - मेरा उत्तर देखें। – Moe

+0

कोई अपराध कर्ता नहीं है, वह सही है :-) –

1

प्रलेखन here, विशेष रूप से देखें:

splitdrive (पी) पथ पथ को ड्राइव और पथ में विभाजित करें। पॉज़िक्स पर, ड्राइव हमेशा खाली है।

तो यह लिनक्स बॉक्स पर काम नहीं करेगा।

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

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