एक सूची में अजगर os.path.join ()


97

मैं कर सकता हूँ

>>> os.path.join("c:/","home","foo","bar","some.txt")
'c:/home\\foo\\bar\\some.txt'

लेकिन जब मैं करता हूं

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(s)
['c:/', 'home', 'foo', 'bar', 'some.txt']

मुझे यहां क्या समझ नहीं आ रहा है?

जवाबों:


197

समस्या यह os.path.joinहै listकि तर्क के रूप में नहीं लिया जाता है, इसके लिए अलग तर्क होते हैं।

यह वह जगह है *, जहां 'स्पैट' ऑपरेटर खेल में आता है ...

मैं कर सकता हूँ

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(*s)
'c:/home\\foo\\bar\\some.txt'

10
splat के लिए कुछ और संदर्भ: docs.python.org/2/tutorial/…
A.Wan

3
ध्यान दें कि मैंने एक पूर्ण पथ के अंतिम भाग को हटाने के लिए इसका उपयोग करने की कोशिश की थी। इसके परिणामस्वरूप एक त्रुटि हुई (Mac में), क्योंकि यह पहले स्लैश को याद कर रहा था /Users/...। इसे हल करने के लिए, मैंने उस स्लैश को मैन्युअल रूप से जोड़ा, अगर किसी को एक ही समस्या का सामना करना पड़ता है ...
J0ANMM

23

यह मानते हुए joinकि इस तरह से डिज़ाइन नहीं किया गया था (जो कि यह है, जैसा कि एटीओजेटोए ने बताया है), और इसमें केवल दो पैरामीटर थे, आप अभी भी बिल्ट-इन का उपयोग कर सकते थे reduce:

>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt'

समान आउटपुट:

>>> os.path.join(*["c:/","home","foo","bar","some.txt"])
'c:/home\\foo\\bar\\some.txt' 

बस पूर्णता और शैक्षिक कारणों के लिए (और अन्य स्थितियों के लिए जहां *काम नहीं करता है)।

अजगर 3 के लिए संकेत

reducefunctoolsमॉड्यूल में ले जाया गया था ।


2
पायथन 3 reduceमें functoolsमॉड्यूल को स्थानांतरित कर दिया गया था, जब मैं किसी अन्य व्यक्ति की तलाश में था।
एडम बदुरा

संकेत के लिए धन्यवाद, मैं अपना जवाब समायोजित करूंगा।
थोरस्टेन क्रान्ज

3
दया आती है कि अजगर इसे गले लगाने और खोलने के बजाय कार्यात्मक शैली से अधिक से अधिक चलता है। चलती reduceएक मॉड्यूल को दूर एक बयान है।
शेरनडेज़ जूल 12'15

यहां तक ​​कि 2.7 में से एकfrom functools import reduce
duhaime

14

मैं उस स्थिति पर ठोकर खाई, जहां सूची खाली हो सकती है। उस स्तिथि में:

os.path.join('', *the_list_with_path_components)

पहले तर्क पर ध्यान दें, जो परिणाम में परिवर्तन नहीं करेगा।


8

यह सिर्फ विधि है। आप कुछ भी याद नहीं कर रहे हैं। आधिकारिक दस्तावेज से पता चलता है कि आप कई रास्ते आपूर्ति करने के लिए सूची खोल का उपयोग कर सकते हैं:

s = "c:/,home,foo,bar,some.txt".split(",")
os.path.join(*s)

*sसिर्फ sअंदर का ध्यान दें os.path.join(*s)। तारांकन का उपयोग सूची के अनपैकिंग को ट्रिगर करेगा, जिसका अर्थ है कि प्रत्येक सूची तर्क को फ़ंक्शन के लिए एक अलग तर्क के रूप में आपूर्ति की जाएगी।


अपने लिंक में एक बार फिर से बेहतर देखें ;-)
थोरस्टेन क्रानज़

@ तो यह एसओ पर पसंद किया जाता है कि उत्तर में प्रासंगिक भागों की नकल करें और न केवल एक लिंक पेस्ट करें, शायद इसलिए
डाउनवोट्स

2

यदि आप एक कार्यात्मक प्रोग्रामिंग के नजरिए से यह सोचना चाहते हैं तो इसे सरल मानचित्र कम करने वाला ऑपरेशन माना जा सकता है।

import os
folders = [("home",".vim"),("home","zathura")]
[reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]

reduceपाइथन 2.x में बनाया गया है। पाइथन 3.x में इसे स्थानांतरित कर दिया गया है itertoolsलेकिन स्वीकृत उत्तर बेहतर है।

इसका उत्तर नीचे दिया गया है, लेकिन यदि आपके पास उन वस्तुओं की एक सूची है, जिनमें शामिल होने की आवश्यकता है।

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