python कैसे अजगर में निर्देशिका की नकल करने के लिए और सभी को अधिलेखित करें?




copy distutils (3)

मैं /home/myUser/dir1/ और उसकी सभी सामग्री (और उनकी सामग्री, आदि) /home/myUser/dir1/ को कॉपी करने की कोशिश कर रहा हूं। इसके अलावा, मैं चाहता हूँ कि प्रतिलिपि dir2/ में सब कुछ अधिलेखित कर दे।

ऐसा लगता है कि distutils.dir_util.copy_tree नौकरी के लिए सही उपकरण हो सकता है, लेकिन यकीन नहीं होता कि इस तरह के एक सरल कार्य के लिए उपयोग करने में कुछ आसान / अधिक स्पष्ट है।

यदि यह सही उपकरण है, तो मैं इसका उपयोग कैसे करूं? docs अनुसार 8 पैरामीटर हैं जो इसे लेते हैं। क्या मुझे सभी 8 पास करने हैं, केवल src , dst और update , और यदि हां, तो मैं कैसे (मैं अजगर के लिए बिल्कुल नया हूं)।

अगर वहाँ कुछ है जो बेहतर है, तो क्या कोई मुझे एक उदाहरण दे सकता है और मुझे सही दिशा में इंगित कर सकता है? अग्रिम में धन्यवाद!

https://code.i-harness.com


आप distutils.dir_util.copy_tree उपयोग कर सकते हैं। यह ठीक काम करता है और आपको हर तर्क को पारित करने की आवश्यकता नहीं है, केवल src और dst अनिवार्य हैं।

हालाँकि आपके मामले में आप shutil.copytree जैसे समान टूल का उपयोग नहीं कर सकते क्योंकि यह अलग तरह से व्यवहार करता है: क्योंकि गंतव्य निर्देशिका मौजूद नहीं होनी चाहिए क्योंकि यह फ़ंक्शन इसकी सामग्री को अधिलेखित करने के लिए उपयोग नहीं किया जा सकता है।

यदि आप cp टूल का उपयोग करना चाहते हैं जैसा कि प्रश्न टिप्पणियों में सुझाया गया है कि subprocess मॉड्यूल का उपयोग करना वर्तमान में नई प्रक्रियाओं को स्पॉन करने के लिए अनुशंसित तरीका है जैसा कि आप os.system फ़ंक्शन के दस्तावेज़ में देख सकते हैं।


यहां एक स्रोत के साथ गंतव्य को फिर से लिखना, किसी भी आवश्यक निर्देशिका को बनाते समय इसे फिर से लिखना एक सरल उपाय है। यह सीमलिंक को संभालता नहीं है, लेकिन यह एक साधारण एक्सटेंशन होगा (ऊपर दिए गए @Michael द्वारा उत्तर देखें)।

def recursive_overwrite(src, dest, ignore=None):
    if os.path.isdir(src):
        if not os.path.isdir(dest):
            os.makedirs(dest)
        files = os.listdir(src)
        if ignore is not None:
            ignored = ignore(src, files)
        else:
            ignored = set()
        for f in files:
            if f not in ignored:
                recursive_overwrite(os.path.join(src, f), 
                                    os.path.join(dest, f), 
                                    ignore)
    else:
        shutil.copyfile(src, dest)

shutil पैकेज पर एक नज़र डालें, विशेष रूप से rmtree और copytree । आप जाँच सकते हैं कि क्या कोई फ़ाइल / पथ os.paths.exists(<path>) साथ मौजूद है।

import shutil
import os

def copy_and_overwrite(from_path, to_path):
    if os.path.exists(to_path):
        shutil.rmtree(to_path)
    shutil.copytree(from_path, to_path)

विन्सेंट copytree काम न करने के बारे में सही था, अगर copytree पहले से मौजूद हैं। इसलिए distutils वर्जन है। नीचे shutil.copytree का एक निश्चित संस्करण है। यह मूल रूप से 1-1 की नकल है, सिवाय पहले os.makedirs() एक के पीछे डाल-अगर-निर्माण:

import os
from shutil import *
def copytree(src, dst, symlinks=False, ignore=None):
    names = os.listdir(src)
    if ignore is not None:
        ignored_names = ignore(src, names)
    else:
        ignored_names = set()

    if not os.path.isdir(dst): # This one line does the trick
        os.makedirs(dst)
    errors = []
    for name in names:
        if name in ignored_names:
            continue
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                copytree(srcname, dstname, symlinks, ignore)
            else:
                # Will raise a SpecialFileError for unsupported file types
                copy2(srcname, dstname)
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except Error, err:
            errors.extend(err.args[0])
        except EnvironmentError, why:
            errors.append((srcname, dstname, str(why)))
    try:
        copystat(src, dst)
    except OSError, why:
        if WindowsError is not None and isinstance(why, WindowsError):
            # Copying file access times may fail on Windows
            pass
        else:
            errors.extend((src, dst, str(why)))
    if errors:
        raise Error, errors






distutils