পাইথন ব্যবহার করে কীভাবে আমি ফাইলগুলির একটি সম্পূর্ণ ডিরেক্টরি একটি বিদ্যমান ডিরেক্টরিতে অনুলিপি করব?


210

নামের একটি ডিরেক্টরি bar(যার মধ্যে এক বা একাধিক ফাইল রয়েছে) এবং নামের একটি ডিরেক্টরি রয়েছে baz(এছাড়াও এক বা একাধিক ফাইল রয়েছে) থেকে নিম্নলিখিত কোডটি চালান । নিশ্চিত করুন যে নামের কোনও ডিরেক্টরি নেই foo

import shutil
shutil.copytree('bar', 'foo')
shutil.copytree('baz', 'foo')

এটি এর সাথে ব্যর্থ হবে:

$ python copytree_test.py 
Traceback (most recent call last):
  File "copytree_test.py", line 5, in <module>
    shutil.copytree('baz', 'foo')
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/shutil.py", line 110, in copytree
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/os.py", line 172, in makedirs
OSError: [Errno 17] File exists: 'foo'

আমি এটি যেমনভাবে টাইপ করেছি তেমনভাবে কাজ করতে চাই:

$ mkdir foo
$ cp bar/* foo/
$ cp baz/* foo/

shutil.copy()প্রতিটি ফাইলের মধ্যে অনুলিপি করার জন্য আমাকে কী ব্যবহার করতে bazহবে foo? (এরই মধ্যে আমি 'বার'-এর বিষয়বস্তুগুলি' ফুও'তে অনুলিপি করার পরে shutil.copytree()?) অথবা এর থেকে সহজ / আরও ভাল উপায় কি?


1
এফওয়াইআই: এখানে মূল কপিরাইট ফাংশনটি রয়েছে, কেবল এটি অনুলিপি করুন এবং প্যাচ করুন :)
স্ক্ল্যামার

3
একটা হল পরিবর্তন সম্পর্কে পাইথন ইস্যু shutil.copytree()'র আচরণ একটি বিদ্যমান ডিরেক্টরী লিখিতভাবে অনুমতি, কিন্তু কিছু আচরণ বিবরণ প্রয়োজনের উপর একমত যেতে চলেছে।
নিক চ্যামাস

2
শুধু উল্লেখ্য যে উপরে বর্ণিত বর্ধিতকরণ অনুরোধটি পাইথন ৩.৮ এর জন্য বাস্তবায়িত হয়েছে: ডকস.পিথন.আর.৩.৮.৮
ওয়াটসনেউ

উত্তর:


174

মান এই সীমাবদ্ধতা shutil.copytree নির্বিচারে এবং বিরক্তিকর বলে মনে হচ্ছে। কার্যসংক্রান্ত:

import os, shutil
def copytree(src, dst, symlinks=False, ignore=None):
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if os.path.isdir(s):
            shutil.copytree(s, d, symlinks, ignore)
        else:
            shutil.copy2(s, d)

নোট করুন যে এটি পুরোপুরি মানের সাথে সামঞ্জস্যপূর্ণ নয় copytree :

  • এটা সম্মান দেয় না symlinks গাছের ignoreমূল ডিরেক্টরিতে এবং পরামিতিsrc ;
  • এটি উত্থাপিত হয় না shutil.Error মূল স্তরে ত্রুটিগুলির জন্যsrc ;
  • সাবট্রি অনুলিপি করার সময় ত্রুটিগুলির ক্ষেত্রে, এটি shutil.Errorঅন্য সাবট্রিকে অনুলিপি করার চেষ্টা করার পরিবর্তে এবং একক সম্মিলিত উত্থাপনের পরিবর্তে সেই সাবট্রিটির জন্য উত্থাপন করবে shutil.Error

50
ধন্যবাদ! এটি সম্পূর্ণ স্বেচ্ছাচারী বলে মনে হয়! শুরুতে shutil.copytreeএকটি করে os.makedirs(dst)কোডের কোনও অংশে একটি প্রাক-বিদ্যমান দির সাথে আসলে সমস্যা হবে না। এই পরিবর্তন করা প্রয়োজন। কমপক্ষে exist_ok=Falseকলটিতে একটি প্যারামিটার সরবরাহ করুন
সিএফআই

6
এটি একটি ভাল উত্তর - তবে নীচে মিতাল ভোরার উত্তরটিও দেখার মতো। তারা shutil.copytree () কল করার চেয়ে কপিরেটিকে পুনরাবৃত্তিতে ডেকেছে কারণ অন্যথায় একই সমস্যা দেখা দেবে। সম্ভবত উত্তরগুলি মার্জ করা বা মিতাল ভোরার আপডেট করা বিবেচনা করুন।
পিজেফেস

4
গন্তব্য শূন্য নয় এমন একটি ডিরেক্টরি অন্তর্ভুক্ত করে এমন কোনও পথ দেওয়া হলে এটি ব্যর্থ হয়। হয়তো কেউ লেজ পুনরাবৃত্তি দিয়ে এটি সমাধান করতে পারে তবে এখানে আপনার কোডে একটি পরিবর্তন রয়েছে যা কাজ করেdef copyTree( src, dst, symlinks=False, ignore=None): for item in os.listdir(src): s = os.path.join(src, item) d = os.path.join(dst, item) if os.path.isdir(s): if os.path.isdir(d): self.recursiveCopyTree(s, d, symlinks, ignore) else: shutil.copytree(s, d, symlinks, ignore) else: shutil.copy2(s, d)
Sojurn

8
মেহ, অতি বিরক্তিকর। এটি 4 বছর পরে, এবং shutil.copytree এখনও এই নির্বোধ বাধা আছে। :-(
15

5
@antred ... কিন্তু distutils.dir_util.copy_tree(), যা এছাড়াও stdlib মধ্যে উপস্থিত ধরনের কোনো সীমাবদ্ধতা এবং আসলে আশানুরূপ আচরণ করে। এটি প্রদত্ত, আপনার নিজের ( ... সাধারণত ভাঙা ) বাস্তবায়নটি আনرول করার চেষ্টা করার কোন বাধ্যতামূলক কারণ নেই । ব্রেন্ডন আবেল এর উত্তর একেবারে এখন গৃহীত সমাধান হওয়া উচিত।
সিসিল কারি

257

এখানে একটি সমাধান যা স্ট্যান্ডার্ড লাইব্রেরির অংশ:

from distutils.dir_util import copy_tree
copy_tree("/a/b/c", "/x/y/z")

এই একই প্রশ্ন দেখুন।

পাইথন দিয়ে ডিরেক্টরি সামগ্রীতে একটি ডিরেক্টরিতে অনুলিপি করুন


5
এটি একটি ভাল কারণ এটি স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে। সিমলিঙ্কস, মোড এবং সময় পাশাপাশি সংরক্ষণ করা যায়।
itafire

1
একটি ছোট অসুবিধা লক্ষ্য করেছেন। distutils.errors.DistutilsInternalError: mkpath: 'name' must be a string, অর্থাত্ এটি গ্রহণ করে না PosixPath। দরকার str(PosixPath)। উন্নতির জন্য তালিকা চান। এই বিষয়টি বাদে আমি এই উত্তরটি পছন্দ করি।
সান

@ সানবার, হ্যাঁ, আমি মনে করি যে এটি অন্যান্য লাইব্রেরির ক্ষেত্রেও ঘটবে যা স্ট্রিং হিসাবে পথ গ্রহণ করে। অবজেক্ট ওরিয়েন্টেড পাথ অবজেক্টগুলির পূর্বের বাস্তবায়নগুলির মতো, আমি মনে করি যে Pathঅবজেক্টটি উত্তরাধিকার সূত্রে পরিণত না করা বাছাইয়ের নেতিবাচক অংশstr
ব্রেন্ডন আবেল

বিটিডব্লিউ, আমি এই ফাংশনটির একটি ডকুমেন্টেড অভাব পূরণ করেছি। এটি এখানে নথিভুক্ত । এই ফাংশনের ব্যবহারকারীরা এটি সম্পর্কে সচেতন হওয়ার পরামর্শ দিয়েছিলেন।
সান বিয়ার

1
"প্রযুক্তিগতভাবে প্রকাশ্য" থাকাকালীন, দয়া করে নোট করুন যে ডিস্টুটিসগুলির বিকাশকারীগণ এটি পরিষ্কার করেছেন (@ সানবার্স, থেক্স! এর একই লিঙ্ক) যা distutils.dir_util.copy_tree()ডিস্টিওটিসের একটি বাস্তবায়ন বিশদ হিসাবে বিবেচিত এবং জনসাধারণের ব্যবহারের জন্য প্রস্তাবিত নয়। আসল সমাধানটি shutil.copytree()আরও বেশি পছন্দ করার জন্য উন্নত / প্রসারিত হওয়া উচিত distutils.dir_util.copy_tree()তবে এর ত্রুটিগুলি ছাড়াই। এরই মধ্যে, আমি অন্যান্য উত্তরে প্রদত্ত কিছুগুলির মতো কাস্টম সহায়ক ফাংশন ব্যবহার করব।
বরিস ডালস্টাইন

61

উপরের ফাংশনটি সর্বদা উত্স থেকে গন্তব্যে ফাইলগুলি অনুলিপি করার চেষ্টা করে যেখানে ফাংশনটিতে আট্জের উত্তর সম্পর্কে সামান্য উন্নতি।

def copytree(src, dst, symlinks=False, ignore=None):
    if not os.path.exists(dst):
        os.makedirs(dst)
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if os.path.isdir(s):
            copytree(s, d, symlinks, ignore)
        else:
            if not os.path.exists(d) or os.stat(s).st_mtime - os.stat(d).st_mtime > 1:
                shutil.copy2(s, d)

আমার উপরোক্ত বাস্তবায়নে

  • ইতিমধ্যে উপস্থিত না থাকলে আউটপুট ডিরেক্টরি তৈরি করা হচ্ছে
  • পুনরাবৃত্তভাবে আমার নিজস্ব পদ্ধতিতে কল করে কপি ডিরেক্টরিটি করা।
  • আমরা যখন ফাইলটি অনুলিপি করতে আসি তখন আমি পরীক্ষা করে দেখি যে ফাইলটি সংশোধিত হয়েছে তবে কেবল আমাদের অনুলিপি করা উচিত।

আমি স্ক্যানস বিল্ডের সাথে উপরের ফাংশনটি ব্যবহার করছি। এটি প্রতিবারের মতো সংকলন করার সময় আমাকে অনেকটা সহায়তা করেছিল যখন আমার সম্পূর্ণ সেট ফাইল অনুলিপি করার প্রয়োজন হতে পারে না .. তবে কেবলমাত্র ফাইলগুলি যা সংশোধন করে।


4
ভাল, আপনি symlinks আছে এবং আর্গুমেন্ট হিসাবে উপেক্ষা ব্যতীত, কিন্তু তারা উপেক্ষা করা হয়।
ম্যাথু আল্পার্ট

এটি লক্ষণীয় যে st_mtime গ্রানুলারিটি FAT ফাইল সিস্টেমগুলি ডকস.পাইথন.আর . / 2 / লিবারি /os.html এ 2 সেকেন্ডের মতো মোটা হতে পারে । এই কোডটি এমন একটি প্রসঙ্গে ব্যবহার করে যেখানে আপডেটগুলি দ্রুত ধারাবাহিকতায় ঘটে, আপনি দেখতে পাবেন যে ওভাররাইডগুলি সংঘটিত হয়নি।
ডিগ্রি

সেখানে দ্বিতীয় টু শেষ লাইনটি একটি বাগ সংশোধন করা হয়, হওয়া উচিত: if not os.path.exists(d) or os.stat(s).st_mtime - os.stat(d).st_mtime > 1:
mpderbec

34

আতজ এবং মিতাল ভোরা দ্বারা অনুপ্রাণিত এক মার্জ:

#!/usr/bin/python
import os
import shutil
import stat
def copytree(src, dst, symlinks = False, ignore = None):
  if not os.path.exists(dst):
    os.makedirs(dst)
    shutil.copystat(src, dst)
  lst = os.listdir(src)
  if ignore:
    excl = ignore(src, lst)
    lst = [x for x in lst if x not in excl]
  for item in lst:
    s = os.path.join(src, item)
    d = os.path.join(dst, item)
    if symlinks and os.path.islink(s):
      if os.path.lexists(d):
        os.remove(d)
      os.symlink(os.readlink(s), d)
      try:
        st = os.lstat(s)
        mode = stat.S_IMODE(st.st_mode)
        os.lchmod(d, mode)
      except:
        pass # lchmod not available
    elif os.path.isdir(s):
      copytree(s, d, symlinks, ignore)
    else:
      shutil.copy2(s, d)
  • শিমিলিকপিপিট্রি হিসাবে একই আচরণ , সিমলিঙ্কগুলি সহ এবং উপেক্ষা করুন পরামিতিগুলি
  • অরক্ষিত না হলে ডিরেক্টরি গন্তব্য কাঠামো তৈরি করুন
  • ডিস্ট ইতিমধ্যে উপস্থিত থাকলে ব্যর্থ হবে না

ডিরেক্টরি নেস্টিং গভীর হয় যখন এটি মূল সমাধানের চেয়ে অনেক বেশি দ্রুত। ধন্যবাদ
কাশিফ

আপনি কোথাও কোডে 'উপেক্ষা' নামে একটি কার্যকারিতা সংজ্ঞায়িত করেছেন?
কেনভি 99

আপনি কপিরাইট ফাংশন কল করার আগে আপনার যে কোনও নামের সাথে কোনও ক্রিয়াকলাপ সংজ্ঞায়িত করতে পারেন। এই ফাংশন (যা ল্যাম্বডা এক্সপ্রেশনও হতে পারে) দুটি আর্গুমেন্ট গ্রহণ করে: একটি ডিরেক্টরি নাম এবং এতে থাকা ফাইলগুলি, এটি ফাইলগুলিকে উপেক্ষা করে পুনরাবৃত্ত হওয়া উচিত।
সাইরিল পন্টভিউক্স

[x for x in lst if x not in excl]এটি কপিরাইটের মতো একই কাজ করে না, যা গ্লোব প্যাটার্ন মেলানো ব্যবহার করে। en.wikedia.org/wiki/Glob_( প্রোগ্রামিং)
কনস্ট্যান্টিন শোবার্ট

2
এটা অসাধারণ. উপরের উত্তরে উপেক্ষা সঠিকভাবে ব্যবহৃত হচ্ছে না।
কিথ হলিদা

21

পাইথন 3.8 dirs_exist_okযুক্তিটির সাথে পরিচয় করিয়ে দিয়েছেshutil.copytree :

Recursively এ রুট একটি সম্পূর্ণ ডিরেক্টরি ট্রি কপি src একটি নামের ডিরেক্টরি থেকে DST এবং গন্তব্য ডিরেক্টরির ফিরে যান। dirs_exist_ok নির্দেশনা কিনা ক্ষেত্রে ব্যতিক্রম বাড়াতে DST বা কোনো অনুপস্থিত পেরেন্ট ডাইরেক্টরি আগে থেকেই আছে।

অতএব, পাইথন 3.8+ এর সাথে এটি কাজ করা উচিত:

import shutil

shutil.copytree('bar', 'foo')
shutil.copytree('baz', 'foo', dirs_exist_ok=True)

dirs_exist_ok=Falseডিফল্টরূপে কপিরীতে, প্রথম অনুলিপি চেষ্টা ব্যর্থ হবে না?
জে

1
@ জায়ে, কেবল যদি ডিরেক্টরি ইতিমধ্যে বিদ্যমান থাকে। dirs_exist_okপার্থক্যটি চিত্রিত করার জন্য আমি প্রথম কলটি ছেড়ে চলে এসেছি (এবং কারণ ওপির উদাহরণে ডিরেক্টরিটি এখনও বিদ্যমান নেই) তবে অবশ্যই আপনি চাইলে এটি ব্যবহার করতে পারেন।
ক্রিস

ধন্যবাদ, আপনি যদি প্রথম অনুলিপিটির নিকটে কোনও মন্তব্য যুক্ত করেন, আমি মনে করি এটি আরও পরিষ্কার করে দেবে :)
জে

7

ডক্স স্পষ্টভাবে বলা হয়েছে যে গন্তব্য সংকলন উচিত না অস্তিত্ব :

নামকরণ করা গন্তব্য ডিরেক্টরিটি dstইতিমধ্যে উপস্থিত থাকতে পারে না; এটি পিতামহীন ডিরেক্টরিগুলি হারিয়ে যাওয়ার পাশাপাশি তৈরি করা হবে।

আমার মনে হয় আপনার সেরা বাজিটি os.walkদ্বিতীয় এবং সমস্ত ফলস্বরূপ ডিরেক্টরি, copy2ডিরেক্টরি এবং ফাইলগুলির মধ্যে রয়েছে এবং copystatডিরেক্টরিগুলির জন্য অতিরিক্ত কাজ করে। সর্বোপরি copytreeএগুলি হ'ল ডক্সে বর্ণিত হিসাবে কি করে। অথবা আপনি copyএবং copystatপ্রতিটি ডিরেক্টরি / ফাইল এবং এর os.listdirপরিবর্তে করতে পারেন os.walk


1

এটি এটিজ দ্বারা প্রদত্ত মূল সেরা উত্তর থেকে অনুপ্রাণিত, আমি কেবল ফাইল / ফোল্ডার যুক্তি প্রতিস্থাপন যুক্ত করেছি। সুতরাং এটি আসলে মার্জ করে না, তবে বিদ্যমান ফাইল / ফোল্ডারটি মুছে দেয় এবং নতুনটি অনুলিপি করে:

import shutil
import os
def copytree(src, dst, symlinks=False, ignore=None):
    for item in os.listdir(src):
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if os.path.exists(d):
            try:
                shutil.rmtree(d)
            except Exception as e:
                print e
                os.unlink(d)
        if os.path.isdir(s):
            shutil.copytree(s, d, symlinks, ignore)
        else:
            shutil.copy2(s, d)
    #shutil.rmtree(src)

Rmtree এ চলাফেরার ক্রিয়াকলাপ হিসাবে মন্তব্য করুন।


0

এখানে একই কাজটির আমার সংস্করণটি ::

import os, glob, shutil

def make_dir(path):
    if not os.path.isdir(path):
        os.mkdir(path)


def copy_dir(source_item, destination_item):
    if os.path.isdir(source_item):
        make_dir(destination_item)
        sub_items = glob.glob(source_item + '/*')
        for sub_item in sub_items:
            copy_dir(sub_item, destination_item + '/' + sub_item.split('/')[-1])
    else:
        shutil.copy(source_item, destination_item)

0

এখানে এই থ্রেড দ্বারা অনুপ্রাণিত একটি সংস্করণ যা আরও ঘনিষ্ঠভাবে নকল করে distutils.file_util.copy_file

updateonlyযদি এটি সত্য হয় dstতবে তালিকাভুক্ত না হলে কেবল বিদ্যমান ফাইলের চেয়ে নতুন পরিবর্তিত তারিখের চেয়ে নতুন ফাইলগুলি অনুলিপি করবেforceupdate কেবলমাত্র অনুলিপি করা হবে তা অনুলিপি করে অনুলিপি করবে।

ignoreএবং forceupdateফাইলের নামের বা ফোল্ডার তালিকা আশা / ফাইলগুলির নাম আপেক্ষিক src ইউনিক্স-শৈলী গ্রহণ এবং অনুরূপ ওয়াইল্ডকার্ড globবাfnmatch

ফাংশনটি অনুলিপি করা ফাইলগুলির একটি তালিকা ফেরত দেয় (বা dryrunযদি সত্য হয় তবে অনুলিপি করা হবে )।

import os
import shutil
import fnmatch
import stat
import itertools

def copyToDir(src, dst, updateonly=True, symlinks=True, ignore=None, forceupdate=None, dryrun=False):

    def copySymLink(srclink, destlink):
        if os.path.lexists(destlink):
            os.remove(destlink)
        os.symlink(os.readlink(srclink), destlink)
        try:
            st = os.lstat(srclink)
            mode = stat.S_IMODE(st.st_mode)
            os.lchmod(destlink, mode)
        except OSError:
            pass  # lchmod not available
    fc = []
    if not os.path.exists(dst) and not dryrun:
        os.makedirs(dst)
        shutil.copystat(src, dst)
    if ignore is not None:
        ignorepatterns = [os.path.join(src, *x.split('/')) for x in ignore]
    else:
        ignorepatterns = []
    if forceupdate is not None:
        forceupdatepatterns = [os.path.join(src, *x.split('/')) for x in forceupdate]
    else:
        forceupdatepatterns = []
    srclen = len(src)
    for root, dirs, files in os.walk(src):
        fullsrcfiles = [os.path.join(root, x) for x in files]
        t = root[srclen+1:]
        dstroot = os.path.join(dst, t)
        fulldstfiles = [os.path.join(dstroot, x) for x in files]
        excludefiles = list(itertools.chain.from_iterable([fnmatch.filter(fullsrcfiles, pattern) for pattern in ignorepatterns]))
        forceupdatefiles = list(itertools.chain.from_iterable([fnmatch.filter(fullsrcfiles, pattern) for pattern in forceupdatepatterns]))
        for directory in dirs:
            fullsrcdir = os.path.join(src, directory)
            fulldstdir = os.path.join(dstroot, directory)
            if os.path.islink(fullsrcdir):
                if symlinks and dryrun is False:
                    copySymLink(fullsrcdir, fulldstdir)
            else:
                if not os.path.exists(directory) and dryrun is False:
                    os.makedirs(os.path.join(dst, dir))
                    shutil.copystat(src, dst)
        for s,d in zip(fullsrcfiles, fulldstfiles):
            if s not in excludefiles:
                if updateonly:
                    go = False
                    if os.path.isfile(d):
                        srcdate = os.stat(s).st_mtime
                        dstdate = os.stat(d).st_mtime
                        if srcdate > dstdate:
                            go = True
                    else:
                        go = True
                    if s in forceupdatefiles:
                        go = True
                    if go is True:
                        fc.append(d)
                        if not dryrun:
                            if os.path.islink(s) and symlinks is True:
                                copySymLink(s, d)
                            else:
                                shutil.copy2(s, d)
                else:
                    fc.append(d)
                    if not dryrun:
                        if os.path.islink(s) and symlinks is True:
                            copySymLink(s, d)
                        else:
                            shutil.copy2(s, d)
    return fc

0

পূর্ববর্তী সমাধানটিতে কিছু সমস্যা রয়েছে যা srcওভাররাইট হতে পারেdst কোনও বিজ্ঞপ্তি বা ব্যতিক্রম ছাড়াই ।

আমি predict_errorঅনুলিপি করার আগে ত্রুটিগুলি পূর্বাভাস দেওয়ার জন্য একটি পদ্ধতি যুক্ত করি । copytreeমূলত সাইরিল পন্টভিউকের সংস্করণে ভিত্তি করে।

predict_errorপ্রথমে সমস্ত ত্রুটি পূর্বাভাস দেওয়ার জন্য ব্যবহার করা সর্বোত্তম, যদি না আপনি copytreeসমস্ত ত্রুটি স্থির না করা পর্যন্ত কার্যকর করার সময় একে অপরের উত্থাপিত ব্যতিক্রমগুলি দেখতে না চান।

def predict_error(src, dst):  
    if os.path.exists(dst):
        src_isdir = os.path.isdir(src)
        dst_isdir = os.path.isdir(dst)
        if src_isdir and dst_isdir:
            pass
        elif src_isdir and not dst_isdir:
            yield {dst:'src is dir but dst is file.'}
        elif not src_isdir and dst_isdir:
            yield {dst:'src is file but dst is dir.'}
        else:
            yield {dst:'already exists a file with same name in dst'}

    if os.path.isdir(src):
        for item in os.listdir(src):
            s = os.path.join(src, item)
            d = os.path.join(dst, item)
            for e in predict_error(s, d):
                yield e


def copytree(src, dst, symlinks=False, ignore=None, overwrite=False):
    '''
    would overwrite if src and dst are both file
    but would not use folder overwrite file, or viceverse
    '''
    if not overwrite:
        errors = list(predict_error(src, dst))
        if errors:
            raise Exception('copy would overwrite some file, error detail:%s' % errors)

    if not os.path.exists(dst):
        os.makedirs(dst)
        shutil.copystat(src, dst)
    lst = os.listdir(src)
    if ignore:
        excl = ignore(src, lst)
        lst = [x for x in lst if x not in excl]
    for item in lst:
        s = os.path.join(src, item)
        d = os.path.join(dst, item)
        if symlinks and os.path.islink(s):
            if os.path.lexists(d):
                os.remove(d)
            os.symlink(os.readlink(s), d)
            try:
                st = os.lstat(s)
                mode = stat.S_IMODE(st.st_mode)
                os.lchmod(d, mode)
            except:
                pass  # lchmod not available
        elif os.path.isdir(s):
            copytree(s, d, symlinks, ignore)
        else:
            if not overwrite:
                if os.path.exists(d):
                    continue
            shutil.copy2(s, d)

0

এখানে সমস্যা আমার পাস। আসল কোডটি মূল কার্যকারিতা ধরে রাখার জন্য আমি কপিরাইটের জন্য সোর্স কোডটি পরিবর্তন করেছি, তবে ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে কোনও ত্রুটি ঘটে না। আমি এটিও পরিবর্তন করেছি যাতে এটি বিদ্যমান ফাইলগুলিকে ওভাররাইট না করে বরং পরিবর্তিত নামযুক্ত দুটি অনুলিপি রাখে, কারণ এটি আমার আবেদনের জন্য গুরুত্বপূর্ণ ছিল was

import shutil
import os


def _copytree(src, dst, symlinks=False, ignore=None):
    """
    This is an improved version of shutil.copytree which allows writing to
    existing folders and does not overwrite existing files but instead appends
    a ~1 to the file name and adds it to the destination path.
    """

    names = os.listdir(src)
    if ignore is not None:
        ignored_names = ignore(src, names)
    else:
        ignored_names = set()

    if not os.path.exists(dst):
        os.makedirs(dst)
        shutil.copystat(src, dst)
    errors = []
    for name in names:
        if name in ignored_names:
            continue
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        i = 1
        while os.path.exists(dstname) and not os.path.isdir(dstname):
            parts = name.split('.')
            file_name = ''
            file_extension = parts[-1]
            # make a new file name inserting ~1 between name and extension
            for j in range(len(parts)-1):
                file_name += parts[j]
                if j < len(parts)-2:
                    file_name += '.'
            suffix = file_name + '~' + str(i) + '.' + file_extension
            dstname = os.path.join(dst, suffix)
            i+=1
        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:
                shutil.copy2(srcname, dstname)
        except (IOError, os.error) as why:
            errors.append((srcname, dstname, str(why)))
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except BaseException as err:
            errors.extend(err.args[0])
    try:
        shutil.copystat(src, dst)
    except WindowsError:
        # can't copy file access times on Windows
        pass
    except OSError as why:
        errors.extend((src, dst, str(why)))
    if errors:
        raise BaseException(errors)

0

এটা চেষ্টা কর:

import os,shutil

def copydir(src, dst):
  h = os.getcwd()
  src = r"{}".format(src)
  if not os.path.isdir(dst):
     print("\n[!] No Such directory: ["+dst+"] !!!")
     exit(1)

  if not os.path.isdir(src):
     print("\n[!] No Such directory: ["+src+"] !!!")
     exit(1)
  if "\\" in src:
     c = "\\"
     tsrc = src.split("\\")[-1:][0]
  else:
    c = "/"
    tsrc = src.split("/")[-1:][0]

  os.chdir(dst)
  if os.path.isdir(tsrc):
    print("\n[!] The Directory Is already exists !!!")
    exit(1)
  try:
    os.mkdir(tsrc)
  except WindowsError:
    print("\n[!] Error: In[ {} ]\nPlease Check Your Dirctory Path !!!".format(src))
    exit(1)
  os.chdir(h)
  files = []
  for i in os.listdir(src):
    files.append(src+c+i)
  if len(files) > 0:
    for i in files:
        if not os.path.isdir(i):
            shutil.copy2(i, dst+c+tsrc)

  print("\n[*] Done ! :)")

copydir("c:\folder1", "c:\folder2")

0

এখানে একটি সংস্করণ যা pathlib.Pathইনপুট হিসাবে প্রত্যাশা করে ।

# Recusively copies the content of the directory src to the directory dst.
# If dst doesn't exist, it is created, together with all missing parent directories.
# If a file from src already exists in dst, the file in dst is overwritten.
# Files already existing in dst which don't exist in src are preserved.
# Symlinks inside src are copied as symlinks, they are not resolved before copying.
#
def copy_dir(src, dst):
    dst.mkdir(parents=True, exist_ok=True)
    for item in os.listdir(src):
        s = src / item
        d = dst / item
        if s.is_dir():
            copy_dir(s, d)
        else:
            shutil.copy2(str(s), str(d))

নোট করুন যে এই ফাংশনটির জন্য পাইথন ৩.6 প্রয়োজন যা পাইথনের প্রথম সংস্করণ যেখানে os.listdir()পথের মতো বস্তুগুলিকে ইনপুট হিসাবে সমর্থন করে। পাইথনের পূর্ববর্তী সংস্করণগুলির যদি আপনার সমর্থন প্রয়োজন হয় তবে আপনি এটি listdir(src)দ্বারা প্রতিস্থাপন করতে পারেন listdir(str(src))


-2

আমি দ্রুততম এবং সহজতম উপায়টি অজগরটি সিস্টেম কমান্ড কল করতাম ...

উদাহরণস্বরূপ ..

import os
cmd = '<command line call>'
os.system(cmd)

ডিরেক্টরিটি টার এবং জিজেপ করুন .... আনজিপ করুন এবং পছন্দসই জায়গায় আনটার করুন।

এ্যা?


আপনি যদি উইন্ডোতে চালাচ্ছেন ... 7zip ডাউনলোড করুন .. এবং এর জন্য কমান্ড লাইন ব্যবহার করুন। ... আবার কেবল পরামর্শ।
কির্বি

31
সিস্টেম কমান্ড সর্বদা একটি সর্বশেষ অবলম্বন হওয়া উচিত। যখনই সম্ভব আপনার স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার করা আরও ভাল যাতে আপনার কোডটি বহনযোগ্য।
জ্যাথানিজম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.