পাইথনে পুনরাবৃত্তভাবে ফাইল বা ডিরেক্টরিগুলি অনুলিপি করুন


116

পাইথনের কাছে ফাইল (যেমন shutil.copy) অনুলিপি করার জন্য ফাংশন এবং ডিরেক্টরিগুলি অনুলিপি করার জন্য ফাংশন রয়েছে (উদাহরণস্বরূপ shutil.copytree) তবে আমি উভয়ই পরিচালনা করে এমন কোনও ফাংশন পাইনি। অবশ্যই, আপনি কোনও ফাইল বা ডিরেক্টরি অনুলিপি করতে চান কিনা তা পরীক্ষা করা তুচ্ছ, তবে এটি একটি অদ্ভুত বাদ পড়ার মতো বলে মনে হয়।

ইউনিক্স cp -rকমান্ডের মতো কার্যত এমন কোনও মানক কার্যকারিতা নেই , যেমন ডিরেক্টরি এবং ফাইল এবং অনুলিপি পুনরুক্তিভাবে উভয় সমর্থন করে? পাইথনের এই সমস্যাটি ঘিরে কাজ করার সবচেয়ে মার্জিত উপায় কী হবে?


3
হ্যাঁ, এটি একটি গোলযোগ। অন্তর্নিহিত সিস্টেম কলগুলি প্রতিফলিত করার চেষ্টা করে পাইথন দৃশ্যমান ইন্টারফেসটিকে আরও খারাপ করে। যদিও অনুলিপি-ফাইল এবং অনুলিপি-গাছের মধ্যে স্যুইচ করা কঠিন নয়, এটির দরকার ছিল না। copytreeএকক ফাইল অনুলিপি করার জন্য পাইথন বাগ ট্র্যাকারে একটি বর্ধিতকরণের অনুরোধ জানাতে পারে ?
বোবিনস

উত্তর:


142

আমি আপনাকে প্রথমে কল করার পরামর্শ দিচ্ছি shutil.copytreeএবং যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে তার সাথে আবার চেষ্টা করুন shutil.copy

import shutil, errno

def copyanything(src, dst):
    try:
        shutil.copytree(src, dst)
    except OSError as exc: # python >2.5
        if exc.errno == errno.ENOTDIR:
            shutil.copy(src, dst)
        else: raise

18
আমি মনে করি যে এটির মতো একটি ব্যতিক্রম ধরা না দিয়ে os.path.isdir (src) ব্যবহার করে ডিরেক্টরিটি কোনও ডিরেক্টরি কিনা তা খালি পরীক্ষা করা আরও পরিষ্কার হবে। বা এর পরিবর্তে এখানে কোনও ব্যতিক্রম ব্যবহার করার কোনও বিশেষ কারণ আছে?
পাফকু

31
1) কারণ পাইথন ওয়ার্ল্ডে ইএএফপি (অনুমতি চেয়ে ক্ষমা চাওয়া সহজ) এলবিওয়াইএল (আপনি লাফানোর আগে দেখুন) এর চেয়ে বেশি পছন্দ করেন। আপনার কাছে এটি যদি নতুন মনে হয় তবে আমি আপনাকে সে সম্পর্কিত লিঙ্ক সরবরাহ করতে পারি। 2) লাইব্রেরির ফাংশন ইতিমধ্যে পরোক্ষভাবে এর জন্য চেক করে, তাহলে চেকটির প্রতিলিপি কেন? 3) shutil.copytreeভবিষ্যতে উভয় ক্ষেত্রেই উন্নতি ও পরিচালনা থেকে কোনও কিছুই কার্যকারিতা থামায় না । 4) পাইথনে ব্যতিক্রমগুলি ব্যতিক্রম নয়; যেমন একটি পুনরাবৃত্তি স্টপ ইন্টেরেশন ব্যতিক্রম ছুঁড়ে দিয়ে থামে।
tzot

2
ঠিক আছে, এই ক্ষেত্রে ব্যতিক্রমটি পরিচালনা করতে lines টি লাইন সময় লাগে, যখন পরীক্ষা করার সময় 4 টি লাইন লাগে lines বেশি নয়, তবে শেষ পর্যন্ত এটি যোগ করে। এছাড়াও, আপনি যেমনটি বলেছেন, কপিরাইট কোনও দিন খুব ভাল ফাইলগুলিও সমর্থন করে। তবে বাস্তবায়নটি কেমন হবে তা বলা অসম্ভব। সম্ভবত এটি এমন কিছু পরিস্থিতিতে ব্যতিক্রম ছুঁড়ে ফেলেছে যেখানে অনুলিপি কাজ করে? সেক্ষেত্রে আমার কোডটি হঠাৎ কেবল যুক্ত কার্যকারিতাটির কারণে কাজ করা বন্ধ করবে। কিন্তু আপনি সম্ভবত ঠিক হয়, ব্যতিক্রম চমত্কার কিছু যা আমি খুব বিরক্তিকর রূপে পেতে পাইথন মধ্যে commong হয়, কিন্তু এটা সম্ভবত কারণ আমি কখনোই এটি ব্যবহার করতে পারেন বলে মনে হচ্ছে
pafcu

5
এই ক্ষেত্রে ব্যতিক্রমগুলির একটি স্পষ্ট উদ্দেশ্যমূলক সুবিধা রয়েছে: এটি পুরোপুরি সম্ভব (যদিও অত্যন্ত সম্ভাবনা নেই) যে চেক এবং কলটির মধ্যে প্রকারটি সঠিক ফাংশনে পরিবর্তিত হয়।
পাফকু

2
আমার ব্যক্তিগত মতে, বাদে মূল কার্যকারিতা যুক্ত করা খারাপ অভ্যাস, আপনি কোন ভাষা ব্যবহার করছেন তা বিবেচ্য নয়। এটি কার্যক্ষমতাটিকে এমন জায়গায় রাখে যেখানে প্রচুর বিকাশকারী অনুসন্ধান করে না। আরও, যদি আপনি কোনও মন্তব্য না লিখেন তবে একটি অল্প অভিজ্ঞ পাইথন বিকাশকারী সত্যই বুঝতে পারবেন না যে এই পুনরায় চেষ্টা করার উদ্দেশ্য কী। এবং যদি আপনার এখানে এখানে যেমন তুচ্ছ জিনিসগুলির জন্য একটি মন্তব্য যুক্ত করতে হয়, আপনার কোড শৈলীতে কিছু ভুল। পরিশেষে, একটি / অন্যথায় লেখার ফলে কোড পড়ার পক্ষে আরও সহজ হবে।
this.myself

7

উপর যোগ করতে Tzot এর এবং gns উত্তর, এখানে যাও recursively ফাইল এবং ফোল্ডার কপি একটি বিকল্প উপায়। (পাইথন ৩. এক্স)

import os, shutil

root_src_dir = r'C:\MyMusic'    #Path/Location of the source directory
root_dst_dir = 'D:MusicBackUp'  #Path to the destination folder

for src_dir, dirs, files in os.walk(root_src_dir):
    dst_dir = src_dir.replace(root_src_dir, root_dst_dir, 1)
    if not os.path.exists(dst_dir):
        os.makedirs(dst_dir)
    for file_ in files:
        src_file = os.path.join(src_dir, file_)
        dst_file = os.path.join(dst_dir, file_)
        if os.path.exists(dst_file):
            os.remove(dst_file)
        shutil.copy(src_file, dst_dir)

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


3

shutil.copy এবং shutil.copy2 ফাইলগুলি অনুলিপি করছে।

shutil.copytreeসমস্ত ফাইল এবং সমস্ত সাবফোল্ডার সহ একটি ফোল্ডার অনুলিপি করে। shutil.copytreeব্যবহার করছেshutil.copy2ফাইলগুলি অনুলিপি করতে করছে।

সুতরাং আপনি যে এনালগটি cp -rবলছেন তা হ'ল shutil.copytreeকারণ cp -rকোনও ফোল্ডার এবং এর ফাইলগুলি / সাবফোল্ডারগুলি লক্ষ্য করে এবং অনুলিপি করে shutil.copytree-r cpকপিগুলি ছাড়া ফাইলগুলি পছন্দ করুন shutil.copyএবং shutil.copy2করুন।


1
আপনি প্রশ্নটি বুঝতে পেরেছি বলে আমি মনে করি না। ব্যবহার করে দেখুন shutil.copytree('C:\myfile.txt', 'C:\otherfile')। এটি কাজ করে না। ওপি 7 বছর আগে ... এই সম্পর্কে জিজ্ঞাসা করেছিল।
জিন-ফ্রানসোয়া কার্বেট

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

2

ইউনিক্স cp'ডিরেক্টরি এবং ফাইল উভয়ই সমর্থন করে না':

betelgeuse:tmp james$ cp source/ dest/
cp: source/ is a directory (not copied).

সিপি অনুলিপি ডিরেক্টরি তৈরি করার জন্য আপনাকে সিপি'কে ম্যানুয়ালি বলতে হবে যে এটি 'ডিরেক্টরি' -r 'পতাকা ব্যবহার করে ডিরেক্টরি a

যদিও এখানে কিছু সংযোগ বিচ্ছিন্ন রয়েছে - cp -rউত্স হিসাবে কোনও ফাইল নাম পাস করার পরে খুশিভাবে কেবল একটি একক ফাইল অনুলিপি করবে; copytree হবে না।


2
docs.python.org/library/shutil.html কপিরাইট () এর কোড অন্তর্ভুক্ত করে যা সাধারণ ফাইল, সিমলিঙ্ক এবং ডিরেক্টরি পরিচালনা করে demonst
জেমস পোলি

1
এই উত্তরটি প্রশ্নের সমাধান করে না। এটি কোনও মন্তব্য হওয়া উচিত, উত্তর নয়।
জিন-

0

আমি মনে করি অনুলিপি_আপনি যা খুঁজছেন তা


-2

অজগর shutil.copytree পদ্ধতি এটি একটি জগাখিচুড়ি। আমি একটি কাজ করেছি যা সঠিকভাবে কাজ করে:

def copydirectorykut(src, dst):
    os.chdir(dst)
    list=os.listdir(src)
    nom= src+'.txt'
    fitx= open(nom, 'w')

    for item in list:
        fitx.write("%s\n" % item)
    fitx.close()

    f = open(nom,'r')
    for line in f.readlines():
        if "." in line:
            shutil.copy(src+'/'+line[:-1],dst+'/'+line[:-1])
        else:
            if not os.path.exists(dst+'/'+line[:-1]):
                os.makedirs(dst+'/'+line[:-1])
                copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
            copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
    f.close()
    os.remove(nom)
    os.chdir('..')

1
এই কোডটি কাজের জন্য পৃথক ফাইল চেক (ওভাররাইটিংয়ের সমস্যা পরীক্ষা করুন) জন্য দুর্দান্ত, তবে বাইনারি ফাইলগুলির জন্য যেমন 'জিপ' কাজ করবে না। লাইন বাই রিড / রাইটিংয়ের পরিবর্তে সাধারণ পাইথন ফাইল কপি ব্যবহার করছেন না কেন?
notilas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.