जांच कैसे करें कि पायथन के साथ क्रॉस प्लेटफॉर्म रास्ते में कोई रास्ता निरपेक्ष पथ या सापेक्ष पथ है?


142

UNIX निरपेक्ष पथ '/' से शुरू होता है, जबकि Windows वर्णमाला 'C:' या '\' से शुरू होता है। क्या किसी पथ के निरपेक्ष या सापेक्ष होने की जांच करने के लिए अजगर का एक मानक कार्य है?

जवाबों:


207

os.path.isabsरिटर्न Trueअगर पथ, निरपेक्ष है Falseनहीं तो। प्रलेखन कहता है कि यह विंडोज़ में काम करता है (मैं व्यक्तिगत रूप से लिनक्स में काम करता है इसकी पुष्टि कर सकता हूं)।

os.path.isabs(my_path)

1
यह फ़ंक्शन क्रॉस-प्लेटफ़ॉर्म नहीं है। यूनिक्स पर os.path.isabs('c:\\')झूठी वापसी।
अनातोली टेकटोनिक

69
Rotfl, और इसे Fse को वापस करना चाहिए, क्योंकि C: \\ यूनिक्स सिस्टम में एक पूर्ण पथ नहीं है। यूनिक्स प्लेटफार्मों पर निरपेक्ष पथ "/" से शुरू होता है, जैसे "/ var / custApp /" आदि :)
मारेक लेवांडोव्स्की

29
@techtonik यह पूरी तरह से किसी और को स्पष्ट करने के लिए जो यह पा सकता है: `c: \` यूनिक्स में एक पूरी तरह से मान्य फ़ाइल / निर्देशिका नाम है। तो, यह वास्तव में एक यूनिक्स प्रणाली पर एक सापेक्ष पथ होगा। इसलिए, फ़ंक्शन क्रॉस-प्लेटफ़ॉर्म है। क्योंकि, यह विंडोज और यूनिक्स की विशेषताओं को ध्यान में रखता है।
लेम्मिंग

1
बिल्कुल सही। यह विभिन्न प्लेटफार्मों पर समान व्यवहार नहीं करता है, यह वर्तमान प्लेटफॉर्म के लिए सही उत्तर देता है।
केविन कॉक्स

सवाल का जवाब नहीं। क्रॉस-प्लेटफ़ॉर्म नियमों का उपयोग करने के लिए 'os.path' के बजाय 'nppath' या 'posixpath' का उपयोग करें
Shoham

43

और यदि आप वास्तव में चाहते हैं कि पूर्ण मार्ग है, तो यह देखने के लिए कि क्या है, यह देखने के लिए जाँच न करें abspath:

import os

print os.path.abspath('.')

7
यह मूल प्रश्न का उत्तर नहीं दे सकता है, लेकिन वास्तव में मैं इसे साकार किए बिना क्या देख रहा था। धन्यवाद!
मेफिस्टो



5

वास्तव में मुझे लगता है कि ऊपर दिए गए उत्तरों में से कोई भी वास्तविक मुद्दा नहीं है: क्रॉस-प्लेटफ़ॉर्म पथ। Os.path क्या करता है, 'पथ' लाइब्रेरी के OS निर्भर संस्करण को लोड करता है। इसलिए समाधान प्रासंगिक (OS) पथ लाइब्रेरी को स्पष्ट रूप से लोड करना है:

import ntpath
import posixpath

ntpath.isabs("Z:/a/b/c../../H/I/J.txt")
    True
posixpath.isabs("Z:/a/b/c../../H/I/J.txt")
    False

हाँ! प्रश्न विशेष रूप से दोनों खिड़कियों और लिनक्स पथों का उल्लेख करता है! एक त्वरित एक-लाइनर जो लगभग सभी सेटअपों में काम करता है: def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
ओलिवर ज़ेंडेल

4

से python 3.4 pathlib उपलब्ध है।

In [1]: from pathlib import Path

In [2]: Path('..').is_absolute()
Out[2]: False

In [3]: Path('C:/').is_absolute()
Out[3]: True

In [4]: Path('..').resolve()
Out[4]: WindowsPath('C:/the/complete/path')

In [5]: Path('C:/').resolve()
Out[5]: WindowsPath('C:/')

1
यह उत्तर वास्तव में विंडोज पर काम करता है .. Path('\tmp').is_absolute()सही तरीके से देता है False, जबकि os.path.isabs('\tmp')गलत तरीके से देता है True। (कुछ का तर्क होगा कि \tmpविंडोज पर एक पूर्ण पथ है, लेकिन यह केवल एक निरपेक्ष मार्ग की बहुत बेकार परिभाषा के लिए सच है ।)
Zbyl

0

एक और तरीका है यदि आप वर्तमान कार्य निर्देशिका में नहीं हैं, थोड़े गंदे लेकिन यह मेरे लिए काम करता है।

import re
path = 'my/relative/path'
# path = '..my/relative/path'
# path = './my/relative/path'

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.