2009-02-04 11 views
32

मैं एक निर्देशिका और इसकी सभी सामग्री को एक पथ में कॉपी करने की कोशिश कर रहा हूं जो पहले से मौजूद है। समस्या यह है कि, ओएस मॉड्यूल और शटल मॉड्यूल के बीच, ऐसा करने का कोई तरीका प्रतीत नहीं होता है। shutil.copytree() फ़ंक्शन अपेक्षा करता है कि गंतव्य पथ पहले से मौजूद नहीं है।पायथन का उपयोग कर किसी मौजूदा स्थान पर निर्देशिका और इसकी सामग्री को कैसे कॉपी करें?

सटीक परिणाम जो मैं ढूंढ रहा हूं वह एक संपूर्ण फ़ोल्डर संरचना को दूसरे के शीर्ष पर कॉपी करना है, जो किसी भी डुप्लिकेट पर चुपचाप ओवरराइट कर रहा है। इससे पहले कि मैं कूदूं और ऐसा करने के लिए अपना खुद का फ़ंक्शन लिखना शुरू करूँ, मैंने सोचा कि मैं पूछूंगा कि क्या कोई मौजूदा नुस्खा या स्निपेट जानता है जो ऐसा करता है।

उत्तर

42

distutils.dir_util.copy_tree जो आप चाहते हैं वह करता है।

Copy an entire directory tree src to a new location dst. Both src and dst must be directory names. If src is not a directory, raise DistutilsFileError. If dst does not exist, it is created with mkpath(). The end result of the copy is that every file in src is copied to dst, and directories under src are recursively copied to dst. Return the list of files that were copied or might have been copied, using their output name. The return value is unaffected by update or dry_run: it is simply the list of all files under src, with the names changed to be under dst.

(ऊपर यूआरएल पर अधिक प्रलेखन)

+1

पहले इसे नहीं देखा है, अच्छा खोज। मेरी एकमात्र चेतावनी यह है कि यह कोई संकेत नहीं देता है कि फाइलों को ओवरराइट किया गया था और जिन्हें नया बनाया गया था। जब तक कि यह एक आवश्यकता नहीं है, हालांकि, यह सही दिखता है। –

+0

यह एक अच्छा है, हालांकि इसकी आवश्यकता होगी कि distutils स्थापित है। ऐसा कोई बड़ा मुद्दा नहीं है क्योंकि हम इसे किसी भी EXE में Pyinstaller के साथ बंडल कर रहे हैं। – Soviut

+0

distutils मानक पुस्तकालय का हिस्सा है, इसलिए सिद्धांत में हमेशा स्थापित होना चाहिए। –

0

os.walk का उपयोग करके इसे अपने आप क्यों लागू नहीं करें?

+5

मैं यही सोच रहा था, लेकिन मैं यह सुनिश्चित करना चाहता था कि मैं पहिया को पुनर्निर्मित नहीं कर रहा था। – Soviut

0
कि shutil मॉड्यूल का उपयोग की तरह है और अपने मामले में copytree समारोह

highlevel फ़ाइल संचालन के लिए। मुझे लगता है कि "abusing" distutils से क्लीनर है।

अद्यतन:: उत्तर भूल जाओ, मैंने अनदेखा किया कि ओपी ने शटल करने का प्रयास किया था।

+1

मैंने अपने प्रश्न में उल्लेख किया कि shutil.copytree() वह है जिसे मैं उपयोग करने की कोशिश कर रहा था लेकिन बिल को फिट नहीं कर रहा था। – Soviut

+1

मैं आम तौर पर इस से सहमत हूं, लेकिन ओ.पी. ने जो कुछ भी पूछा वह काफी नहीं करता है। –

+1

आप लोग सही हैं, मैंने अनदेखा किया कि सवाल में, शाम बहुत देर हो चुकी थी :-) –

0

क्या आप उस त्रुटि को प्राप्त कर रहे हैं जो कहता है "जब यह पहले से मौजूद है तो निर्देशिका नहीं बना सकता"? मुझे यकीन है कि नहीं कितना मूर्खतापूर्ण यह है हूँ, लेकिन सब मैंने किया copytree मॉड्यूल में एक पंक्ति सम्मिलित करने के लिए किया गया था: मैं बदल दिया है:

में
def copytree(src, dst, symlinks=False): 
    names = os.listdir(src) 
    os.makedirs(dst) 

:

def copytree(src, dst, symlinks=False): 
    names = os.listdir(src) 
    if (os.path.isdir(dst)==False): 
     os.makedirs(dst)  

मुझे लगता है कि मैं कुछ नहीं किया bluder। यदि हां, तो क्या कोई मुझे उसको इंगित कर सकता है? क्षमा करें, मैं अजगर के लिए बहुत नया हूं: पी

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

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