পাইথনে একাধিক ফাইল অনুলিপি করুন


98

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


উত্তর:


140

আপনি ব্যবহার করতে পারেন os.listdir () সোর্স ডিরেক্টরির মধ্যে ফাইল পেতে, os.path.isfile () যদি তারা নিয়মিত ফাইল (* স্নো সিস্টেমে সিম্বলিক লিংক সহ) দেখতে, এবং shutil.copy কপি না।

নিম্নলিখিত কোডগুলি কেবল গন্তব্য ডিরেক্টরিতে উত্স ডিরেক্টরি থেকে নিয়মিত ফাইলগুলি অনুলিপি করে (আমি ধরে নিচ্ছি যে আপনি কোনও উপ-ডিরেক্টরি অনুলিপি করতে চান না)।

import os
import shutil
src_files = os.listdir(src)
for file_name in src_files:
    full_file_name = os.path.join(src, file_name)
    if os.path.isfile(full_file_name):
        shutil.copy(full_file_name, dest)

ভাগ্য কি সি: \ মাইফোল্ডার বা সি: \ মাইফোল্ডার \ ফাইলের নাম.েক্সেক্সের মতো কিছু হওয়া উচিত?
স্টিভ বাইর্ন

4
@ স্টেভেনবায়ার্ন আপনি ফাইলের নামও পরিবর্তন করতে চান কিনা তার উপর নির্ভর করে হতে পারে। যদি না destহয় তবে ডিরেক্টরিটির নাম। shutil.copy(src, dst)"ফাইল বা ডিরেক্টরিতে ডিএসসি ফাইলটি এসআরসি-র অনুলিপি করে .... ডিস্টে কোনও ডিরেক্টরি নির্দিষ্ট করে থাকলে, এসআরসি থেকে বেস ফাইল নাম ব্যবহার করে ফাইলটি ডিএসটি-তে অনুলিপি করা হবে।"

ছোট উন্নতি: src_files ছেড়ে for fn in os.listdir(src)
টিমো

32

আপনি যদি পুরো গাছটি (সাবডির ইত্যাদি সহ) অনুলিপি করতে না চান তবে সমস্ত glob.glob("path/to/dir/*.*")ফাইলের একটি তালিকা ব্যবহার করতে বা ব্যবহার shutil.copyকরতে , তালিকার উপর লুপ করুন এবং প্রতিটি ফাইল অনুলিপি করতে ব্যবহার করুন।

for filename in glob.glob(os.path.join(source_dir, '*.*')):
    shutil.copy(filename, dest_dir)

4
দ্রষ্টব্য: আপনার ফাইলের নাম কিনা তা নিশ্চিত করতে আপনাকে os.path.isfile () দিয়ে বিশ্বব্যাপী ফলাফলগুলি পরীক্ষা করতে হবে। গ্রিনম্যাটের উত্তরও দেখুন। যদিও গ্লোব os.listdir এর মতো কেবল ফাইলের নামটি দেয়, তবুও এটি ডিরেক্টরি নামগুলিও দেয়। ' 'প্যাটার্নটি পর্যাপ্ত হতে পারে, যতক্ষণ না আপনার কাছে এক্সটেনশনহীন ফাইলের নাম বা ডিরেক্টরিগুলির নাম না থাকে।
স্টিভেন

এটি সাবদারদের অনুলিপি করে না
সিটিএনরম্যান

13

পাইথন ডক্সে শুটিলটি দেখুন , বিশেষত কপিরাইট কমান্ড।

গন্তব্য ডিরেক্টরি ইতিমধ্যে বিদ্যমান থাকলে, চেষ্টা করুন:

shutil.copytree(source, destination, dirs_exist_ok=True)

4
ভাল মন্তব্য, তবে ডিরেক্টরিটি আমার ক্ষেত্রে যেমন কোনও কারণে ইতিমধ্যে উপস্থিত থাকলে এটি কোনও বিকল্প নাও হতে পারে।
সেভেন

@ স্যাভেন এর জন্য চেষ্টা dirs_exist_ok=Trueবিকল্প।
এমাদাপ্রেস

5
def recursive_copy_files(source_path, destination_path, override=False):
    """
    Recursive copies files from source  to destination directory.
    :param source_path: source directory
    :param destination_path: destination directory
    :param override if True all files will be overridden otherwise skip if file exist
    :return: count of copied files
    """
    files_count = 0
    if not os.path.exists(destination_path):
        os.mkdir(destination_path)
    items = glob.glob(source_path + '/*')
    for item in items:
        if os.path.isdir(item):
            path = os.path.join(destination_path, item.split('/')[-1])
            files_count += recursive_copy_files(source_path=item, destination_path=path, override=override)
        else:
            file = os.path.join(destination_path, item.split('/')[-1])
            if not os.path.exists(file) or override:
                shutil.copyfile(item, file)
                files_count += 1
    return files_count

4
এটি আপনার
কোডটির

4
আমি মনে করি আপনি ওভাররাইটের অর্থ ওভাররাইড
মোহাম্মদ এলনেসার

কনস্ট্যান্টিন দুর্দান্ত উত্তর !! আমাকে অনেক সাহায্য করেছে যদিও একটি পরামর্শ: '/' এর পরিবর্তে os.sep ব্যবহার করতে (সুতরাং এটি নন-লিনাক্স ওএসে কাজ করে)
অ্যারি


3

এখানে একটি পুনরাবৃত্তির অনুলিপি ফাংশনের আরও একটি উদাহরণ যা আপনাকে একবারে ডিরেক্টরিগুলির (সাব-ডিরেক্টরি সহ) একটি ফাইল অনুলিপি করতে দেয় যা আমি এই সমস্যাটি সমাধান করার জন্য ব্যবহার করি।

import os
import shutil

def recursive_copy(src, dest):
    """
    Copy each file from src dir to dest dir, including sub-directories.
    """
    for item in os.listdir(src):
        file_path = os.path.join(src, item)

        # if item is a file, copy it
        if os.path.isfile(file_path):
            shutil.copy(file_path, dest)

        # else if item is a folder, recurse 
        elif os.path.isdir(file_path):
            new_dest = os.path.join(dest, item)
            os.mkdir(new_dest)
            recursive_copy(file_path, new_dest)

সম্পাদনা: আপনি যদি পারেন তবে অবশ্যই ব্যবহার করুন shutil.copytree(src, dest)। এটির জন্য প্রয়োজন যে গন্তব্য ফোল্ডারটি ইতিমধ্যে উপস্থিত নেই। আপনার যদি কোনও বিদ্যমান ফোল্ডারে ফাইলগুলি অনুলিপি করতে হয় তবে উপরের পদ্ধতিটি ভালভাবে কাজ করে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.