2012-06-06 14 views
36

पायथन में मेरे पास चर base_dir और filename हैं। मैं fullpath प्राप्त करने के लिए उन्हें जोड़ना चाहता हूं। लेकिन विंडोज़ के तहत मुझे \ और POSIX / का उपयोग करना चाहिए।concatenate पथ - प्लेटफ़ॉर्म स्वतंत्र - "/", ""

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

इसे प्लेटफार्म स्वतंत्र कैसे बनाएं?

डुप्लिकेट: Platform-independent file paths?

+0

[प्लेटफार्म-स्वतंत्र फ़ाइल पथ?] (Http://stackoverflow.com/questions/6036129/platform-independent-file-paths) के संभावित डुप्लिकेट –

उत्तर

72

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

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

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 मॉड्यूल निर्देशिका, पथ हेरफेर और ओएस जानने के लिए कई उपयोगी तरीकों में शामिल है विशिष्ट जानकारी, जैसे विभाजकके माध्यम से पथों में उपयोग किया जाता है

+3

हालांकि, विंडोज़ भी स्लैश को आगे बढ़ाता है। – multigoodverse

17

उपयोग os.path.join():

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

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

+1

यह * पूर्ण * पथ नहीं है यदि 'base_dir' एक सापेक्ष पथ है (ओपी के बावजूद इसका उपयोग करता है) – jfs

+1

'abspath()' कॉल जोड़ना अगर इसमें कोई सापेक्ष है तो इसे पूर्ण पथ बनाना चाहिए। – martineau

+0

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

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

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

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 
2

यहां पुराने सवाल को खुदाई, लेकिन अजगर पर आप उपयोग कर सकते 3.4+ pathlib operators:

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() से संभावित रूप से अधिक पठनीय है यदि आप पाइथन के हाल के संस्करण को चलाने के लिए भाग्यशाली हैं। लेकिन, यदि आप अपने कोड को एक कठोर या विरासत वातावरण में चलाने के लिए पाइथन के पुराने संस्करणों के साथ ट्रेडऑफ संगतता भी करते हैं।

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