पायथन में लिनक्स और विंडोज दोनों में "/" (निर्देशिका विभाजक) का उपयोग कैसे करें?


191

मैंने अजगर में एक कोड लिखा है जो किसी फ़ोल्डर में एक विशेष फ़ाइल बनाने के लिए / का उपयोग करता है, अगर मैं विंडोज़ में कोड का उपयोग करना चाहता हूं तो यह काम नहीं करेगा, क्या कोई ऐसा तरीका है जिसके द्वारा मैं विंडोज और लिनक्स में कोड का उपयोग कर सकता हूं।

अजगर में मैं इस कोड का उपयोग कर रहा हूं:

pathfile=os.path.dirname(templateFile)
rootTree.write(''+pathfile+'/output/log.txt')

जब मैं अपने कोड का उपयोग करूँगा, तो लगता है कि मेरा कोड काम नहीं करेगा।

मैं लिनक्स और विंडोज दोनों में "/" (डायरेक्टरी सेपरेटर) का उपयोग कैसे करूं?


1
आप इसे शुरुआत में विन / * निक्स के आधार पर परिभाषित कर सकते हैं और फिर चर के साथ काम कर सकते हैं।
फेडोरक्वी 'SO

12
Windows में आप या तो / या निर्देशिका विभाजक के रूप में उपयोग कर सकते हैं।
सिक्योरिटीमैट

12
Windows /निर्देशिका पथों में समर्थन करता है। आपको क्या विशिष्ट समस्या है? कुछ कोड पोस्ट करें जो समस्या का चित्रण करते हैं।
माइकल गीरी

जब तक आप विंडोज यूजरस्पेस कार्यक्रमों पर निर्भर करते हैं, फॉरवर्ड स्लैश काम करता है और साथ ही पिछड़े भी। हालाँकि, कुछ cmd कमांड्स में समस्याएँ हैं।
पिहान

1
@ मेहरदाद: क्या आप एक ऐसा उदाहरण जानते हैं जिसके लिए Win32 API '/' स्वीकार नहीं करता है? (नहीं गिनती cmd.exe और अन्य कार्यक्रमों)
Eryk Sun

जवाबों:


268

का उपयोग करें os.path.join()। उदाहरण: os.path.join(pathfile,"output","log.txt")

आपके कोड में यह होगा: rootTree.write(os.path.join(pathfile,"output","log.txt"))


8
os.path.joinकई सापेक्ष पथ घटकों को एक साथ मिलाने के लिए अधिक जटिल तर्क का उपयोग करता है। जब आप उन्हें चेन करना चाहते हैं, os.sep.joinतो सही विकल्प है।
बछसौ

108

उपयोग:

import os
print os.sep

यह देखने के लिए कि वर्तमान ओएस पर विभाजक कैसा दिखता है।
अपने कोड में आप उपयोग कर सकते हैं:

import os
path = os.path.join('folder_name', 'file_name')


39

os.path.normpath(pathname)इसका उल्लेख भी किया जाना चाहिए क्योंकि यह /पथ विभाजकों को \विंडोज पर विभाजकों में परिवर्तित करता है । यह भी बेमानी uplevel संदर्भ ... यानी संक्षिप्त हो जाता है A/Bऔर A/foo/../Bऔर A/./Bसब बन A/B। और अगर आप विंडोज हैं, तो ये सब बन जाते हैं A\B


3
यह IMO इस सवाल का सबसे अच्छा जवाब है क्योंकि इसे "लिनक्स / विंडोज दोनों में" / "(डायरेक्ट्री सेपरेटर)" का उपयोग कैसे किया जाता है। और यह मुख्य रूप से उपयोगी है - जब मैं एक लंबा रास्ता निर्दिष्ट करने की आवश्यकता होती हूं os.path.normpath('a/b/c/d/file.ext'), os.path.join('a','b','c','d','file.ext')तो मैं बहुत कुछ करता हूं।
उक्रुट्ट

मुझे भी यह उत्तर बहुत मददगार लगा। मैं एक सुसंगत विभाजक के साथ पथ बनाने के लिए एक विधि की तलाश में था। प्रसिद्ध os.path.joinबस प्रदान की गई किसी भी चीज़ से जुड़ता है। उदाहरण join("a/b", "c\d")देता है a/b\c\d(विंडोज़ पर)। लेकिन मैं अपेक्षित परिणाम प्राप्त कर सकता हूं joinऔर ( normpathजैसे a\b\c\dखिड़कियों पर)
सुमुदु

17

यदि आप भाग्यशाली हैं कि पायथन 3.4+ चला रहे हैं, तो आप इसका उपयोग कर सकते हैं pathlib:

from pathlib import Path

path = Path(dir, subdir, filename)  # returns a path of the system's path flavour

या, समकक्ष,

path = Path(dir) / subdir / filename

16

कुछ उपयोगी लिंक जो आपकी मदद करेंगे:


2
pathsep? आम तौर पर उपयोगी है, लेकिन यहां नहीं, आईएमओ।
ग्लॉगल

2
@ हेग्लगल तथ्य। मैंने तलाश की sepलेकिन यह पोस्ट करने के लिए खुद का विरोध नहीं कर सका (मुझे लगा कि ओपी को भविष्य के काम के लिए यह उपयोगी लगेगा) :)
Maroun


8

आप " os.sep " का उपयोग कर सकते हैं

 import os
 pathfile=os.path.dirname(templateFile)
 directory = str(pathfile)+os.sep+'output'+os.sep+'log.txt'
 rootTree.write(directory)

4

निर्देशिका का निर्माण न करें और अपने स्वयं के नाम दर्ज करें, अजगर के शामिल पुस्तकालयों का उपयोग करें।

इस मामले में प्रासंगिक एक os.path है । विशेष रूप से शामिल हों जो एक निर्देशिका और फ़ाइल नाम या निर्देशिका से एक नया पथनाम बनाता है और एक पूर्ण पथ से फ़ाइल नाम प्राप्त करता है।

आपका उदाहरण होगा

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.