2013-02-12 17 views
46

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

>>> 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'] 

करना मैं यहाँ क्या याद आ रही है?

उत्तर

94

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

यह जहां *, 'सूचक' ऑपरेटर चलन में आता है ...

मैं

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

विभाजन के लिए कुछ और संदर्भ: https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists –

+1

ध्यान दें कि मैंने इसे पूर्ण पथ के अंतिम भाग को हटाने के लिए इसका उपयोग करने का प्रयास किया है। इसके परिणामस्वरूप एक [त्रुटि] (http: // stackoverflow।com/प्रश्न/31693272/errno-2-use-python-shutil-py-no-file-or-directory-for-file-destination) (मैक में), क्योंकि यह '/ उपयोगकर्ताओं पर पहली स्लैश गायब था/... '। इसे हल करने के लिए, मैंने जोड़ा कि मैन्युअल रूप से अग्रणी स्लैश ... यदि किसी को भी एक ही समस्या का सामना करना पड़ता है ... – J0ANMM

4

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

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

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

+0

एक बार फिर अपने लिंक में बेहतर दिखें ;-) –

+0

@ThorstenKranz गंभीरता से? लिंक पूरी तरह से काम करता है। – Greg

+0

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

14

join यह मानते हुए कि जिस तरह से डिजाइन किया गया था नहीं है (यह है जो, के रूप में ATOzTOA ने बताया), और यह केवल दो पैरामीटर ले लिया है, तो आप अभी भी निर्मित 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 अजगर 3, reduce के लिए के लिए

सुझाव functools मॉड्यूल के लिए ले जाया गया था।

+1

पाइथन 3 'कम' में 'functools' मॉड्यूल में ले जाया गया था यदि कोई और इसे ढूंढ रहा था मैं था। –

+0

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

+2

करुणा है कि पाइथन इसे गले लगाने और खोलने के बजाय कार्यात्मक शैली से अधिक से अधिक दूर चलता है। एक मॉड्यूल में 'कम' दूर ले जाना एक बयान है। – SHernandez

6

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

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

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

0

यदि आप इसे एक कार्यात्मक प्रोग्रामिंग परिप्रेक्ष्य से सोचना चाहते हैं तो इसे सरल मानचित्र के रूप में भी सोचा जा सकता है।

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 पर ले जाया गया है हालांकि स्वीकार किया गया जवाब बेहतर है।

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

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