पायथन में कई फ़ाइलों की प्रतिलिपि बनाएँ


95

पायथन का उपयोग करके एक डायरेक्टरी में मौजूद सभी फाइलों को दूसरी डायरेक्टरी में कॉपी कैसे करें। मेरे पास स्रोत पथ और गंतव्य पथ स्ट्रिंग के रूप में है।


जवाबों:


139

आप स्रोत निर्देशिका में फ़ाइलों को प्राप्त करने के लिए 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)

क्या C: \ myfolder या C: \ myfolder \ filename.ext जैसा कुछ होना चाहिए?
स्टीव ब्रेन

4
@StevenByrne या तो हो सकता है, इस पर निर्भर करता है कि आप फ़ाइल का नाम बदलना चाहते हैं या नहीं। यदि नहीं, तो destनिर्देशिका नाम है। shutil.copy(src, dst)"फ़ाइल src को फ़ाइल या निर्देशिका dst पर कॉपी करता है .... यदि dst एक निर्देशिका निर्दिष्ट करता है, तो फ़ाइल को src से आधार फ़ाइल नाम का उपयोग करके dst में कॉपी किया जाएगा।"

30

यदि आप पूरे वृक्ष (उपखंड आदि के साथ) की प्रतिलिपि नहीं बनाना चाहते हैं, तो glob.glob("path/to/dir/*.*")सभी फ़ाइलनामों की सूची प्राप्त करने के लिए उपयोग करें या सूची पर लूप करें और shutil.copyप्रत्येक फ़ाइल को कॉपी करने के लिए उपयोग करें।

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

2
नोट: आपको os.path.isfile () के साथ ग्लोब परिणामों की जांच करनी होगी सुनिश्चित करें कि वे फ़ाइल नाम हैं। ग्रीनमैट का जवाब भी देखें। जबकि ग्लोब केवल os.listdir जैसे फ़ाइलनाम को वापस करता है, यह अभी भी निर्देशिका नामों को भी लौटाता है। द ' 'पैटर्न पर्याप्त हो सकता है, जब तक कि आपके पास विस्तारहीन फ़ाइल नाम, या निर्देशिका नामों में डॉट्स न हों।
स्टीवन



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

1
यह
calico_

1
मुझे लगता है कि आपका मतलब ओवरराइट है , ओवरराइड
मोहम्मद एलनीसर

कोंस्टेंटिन महान जवाब !! मेरी बहुत मदद की। एक सुझाव हालांकि: '/' के बजाय os.sep का उपयोग करने के लिए (इसलिए यह नॉन-लाइनक्स OS पर काम करता है)
Ari


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)। इसके लिए आवश्यक है कि गंतव्य फ़ोल्डर पहले से मौजूद न हो। यदि आपको मौजूदा फ़ोल्डर में फ़ाइलों को कॉपी करने की आवश्यकता है, तो उपरोक्त विधि अच्छी तरह से काम करती है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.