"/", "\" का उपयोग करके प्लेटफ़ॉर्म स्वतंत्र पथ संघटन?


85

अजगर में मैं चर है base_dirऔर filename। मैं उन्हें प्राप्त करने के लिए सहमति देना चाहूंगा fullpath। लेकिन विंडोज़ के तहत मुझे \POSIX का उपयोग करना चाहिए /

fullpath = "%s/%s" % ( base_dir, filename ) # for Linux

मैं इस प्लेटफ़ॉर्म को स्वतंत्र कैसे बना सकता हूं?




जवाबों:


149

आप इसके लिए os.path.join () का उपयोग करना चाहते हैं ।

स्ट्रिंग कॉन्टेनेशन आदि के बजाय इसका उपयोग करने की ताकत यह है कि यह विभिन्न ओएस विशिष्ट मुद्दों, जैसे कि पथ विभाजक के बारे में पता है। उदाहरण:

import os

विंडोज 7 के तहत :

base_dir = r'c:\bla\bing'
filename = r'data.txt'

os.path.join(base_dir, filename)
'c:\\bla\\bing\\data.txt'

लिनक्स के तहत :

base_dir = '/bla/bing'
filename = 'data.txt'

os.path.join(base_dir, filename)
'/bla/bing/data.txt'

ओएस मॉड्यूल इस तरह के माध्यम से पथ में इस्तेमाल विभाजक के रूप में निर्देशिका पथ हेरफेर और ओएस विशेष जानकारी जानने के लिए कई उपयोगी तरीकों, शामिल os.sep


26

उपयोग करें os.path.join():

import os
fullpath = os.path.join(base_dir, filename)

Os.path मॉड्यूल तरीकों आप मंच स्वतंत्र पथ हेरफेर के लिए की आवश्यकता चाहिए के सभी शामिल है, लेकिन मामले में आप को पता है कि पथ विभाजक आप उपयोग कर सकते हैं वर्तमान मंच पर है की जरूरत है os.sep


1
ऐसा नहीं है पूर्ण पथ अगर base_dirएक रिश्तेदार पथ (ओपी यह का उपयोग करता है के बावजूद) है
JFS

1
abspath()कॉल जोड़ने पर इसे एक पूर्ण पथ बनाना चाहिए यदि इसमें कुछ भी सापेक्ष है।
मार्टिउ

@Andrew क्लार्क, os.sep विंडोज़ पर "\\" देता है, लेकिन यह तब भी काम करता है, जब मैं "/" का उपयोग करता हूं। क्या कोई समस्या है अगर हम सिर्फ "/" का उपयोग करते हैं?
मल्टीगुडवर्स

12

यहां एक पुराने प्रश्न को खोदते हुए, लेकिन पायथन 3.4+ पर आप पाथलिब ऑपरेटरों का उपयोग कर सकते हैं :

from pathlib import Path

# evaluates to ./src/cool-code/coolest-code.py on Mac
concatenated_path = Path("./src") / "cool-code\\coolest-code.py"

यह संभावित रूप से अधिक पठनीय है os.path.join()यदि आप बहुत भाग्यशाली हैं जो हाल ही में पायथन का संस्करण चला रहा है। लेकिन, आप पायथन के पुराने संस्करणों के साथ संगतता का व्यापार भी करते हैं यदि आपको अपने कोड को कठोर या विरासत वाले वातावरण में चलाना है।


मैं बहुत शौकीन हूं pathlib। हालाँकि, इसे अक्सर Python2 स्थापनाओं में डिफ़ॉल्ट रूप से स्थापित नहीं किया जाता है। यदि आप नहीं चाहते हैं कि उपयोगकर्ताओं को पाथलिब स्थापित करने से गुजरना पड़े, तो जाने os.path.join()का सबसे सरल तरीका है।
मार्सेल वाल्डवोगेल

7
import os
path = os.path.join("foo", "bar")
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed.

1

मैंने इसके लिए एक सहायक वर्ग बनाया है:

import os

class u(str):
    """
        Class to deal with urls concat.
    """
    def __init__(self, url):
        self.url = str(url)

    def __add__(self, other):
        if isinstance(other, u):
            return u(os.path.join(self.url, other.url))
        else:
            return u(os.path.join(self.url, other))

    def __unicode__(self):
        return self.url

    def __repr__(self):
        return self.url

उपयोग है:

    a = u("http://some/path")
    b = a + "and/some/another/path" # http://some/path/and/some/another/path

क्या यह विंडोज पर बैकस्लैश नहीं डालेगा?
मार्सेल वाल्डवोगेल

0

इसके लिए धन्यवाद। किसी और के लिए जो इसे fbs या pyinstaller और जमे हुए ऐप्स का उपयोग करके देखता है।

मैं नीचे उपयोग कर सकता हूं जो अभी काम करता है।

target_db = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), "sqlite_example.db")

मैं यह फर्जीवाड़ा कर रहा था, जो स्पष्ट रूप से आदर्श नहीं था।

if platform == 'Windows':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "\\" + "sqlite_example.db")

if platform == 'Linux' or 'MAC':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "/" + "sqlite_example.db")

target_db_path = target_db
print(target_db_path)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.