2010-08-03 5 views
51

में एकाधिक फ़ाइलों की प्रतिलिपि बनाएँ सभी फ़ाइलों को एक निर्देशिका में दूसरे में पाइथन में कॉपी करने के लिए कैसे करें। मेरे पास स्ट्रिंग में स्रोत पथ और गंतव्य पथ है।पायथन

+0

[मैं कैसे का उपयोग करने के लिए एक मौजूदा निर्देशिका में फ़ाइलों की एक पूरी निर्देशिका कॉपी कर सकता हूँ अजगर?] (Http://stackoverflow.com/questions/1868714/how-do-i-copy -n-whole-directory-of-files-in-current-directory-use-pyth) –

उत्तर

69

आप os.listdir()os.path.isfile() अगर वे नियमित रूप से फ़ाइलें (* nix सिस्टम पर सांकेतिक लिंक सहित) को देखने के लिए उपयोग कर सकते हैं 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) 
7

shutil in the Python docs पर विशेष रूप से copytree कमांड देखें।

+0

अच्छी टिप्पणी, लेकिन यह एक विकल्प नहीं हो सकता है यदि निर्देशिका मेरे मामले में किसी कारण से पहले से मौजूद है। – Sven

12

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

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

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

0
import os 
import shutil 
os.chdir('C:\\') #Make sure you add your source and destination path below 

dir_src = ("C:\\foooo\\") 
dir_dst = ("C:\\toooo\\") 

for filename in os.listdir(dir_src): 
    if filename.endswith('.txt'): 
     shutil.copy(dir_src + filename, dir_dst) 
    print(filename) 
1
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

यह आपके कोड –

+0

का मौखिक स्पष्टीकरण देने में मदद कर सकता है, मुझे लगता है कि आपका मतलब ** ** ओवरराइट **, ** ** ओवरराइड नहीं है ** –