दिलचस्प पोस्ट
क्यों scanf ("% d", ) '\ n' का उपभोग नहीं करता? जबकि scanf ("% c") करता है? ObjC कार्यान्वयन फ़ाइल में घोषित इंस्टेंस व्हेरिएबल्स एक विशेष मूल्य से एक बहुआयामी सरणी समूह? स्ट्रिंग से गैर-अंकों को फ़िल्टर करें पायथन में सही समकक्ष क्या है "जबकि नहीं EOF" MySQL पहली पंक्ति लंघन हैंडलबार / मूंछें – क्या किसी ऑब्जेक्ट के गुणों के माध्यम से लूप का निर्माण होता है? वेक्टर <int> वेक्टर <डबल> वेक्टर कन्वर्ट करने के लिए C ++ पोस्टक्रेज़ में subquery का उपयोग करते हुए तालिका पंक्तियां अपडेट करना अधिकांश पोर्ट पर सुनते समय Node.js EACCES त्रुटि बड़ी संख्या में कक्षा के सबसे प्रभावी कार्यान्वयन टीएसक्यूएल: स्थानीय समय को यूटीसी में कनवर्ट कैसे करें? (SQL सर्वर 2008) जावा: स्विंग पुस्तकालय और थ्रेड सुरक्षा ए (ए) क्या मतलब है? तेज और एकाधिक दृश्य नियंत्रकों के साथ UIPageViewController का उपयोग करना

मैं मौजूदा निर्देशिका में पायथन के माध्यम से फ़ाइलों की संपूर्ण निर्देशिका की प्रतिलिपि कैसे बनाऊं?

एक निर्देशिका से नीचे दिए गए कोड को चलाएं जिसमें एक नामित 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() का उपयोग करने की आवश्यकता है? (क्या मैंने shutil.copytree() साथ 'फू' में 'बार' की सामग्री को पहले से कॉपी कर shutil.copytree() ? या क्या कोई आसान / बेहतर तरीका है?

Solutions Collecting From Web of "मैं मौजूदा निर्देशिका में पायथन के माध्यम से फ़ाइलों की संपूर्ण निर्देशिका की प्रतिलिपि कैसे बनाऊं?"

मानक shutil.copytree की यह सीमा मनमाना और कष्टप्रद लगता है। युक्ति:

 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) 

ध्यान दें कि यह मानक नकल के साथ पूरी तरह से संगत नहीं है:

  • यह symlinks सम्मान नहीं करता है और src ट्री के रूट डायरेक्टरी के लिए मापदंडों को ignore करता है;
  • यह shutil.Error नहीं shutil.Error है। src के रूट स्तर पर त्रुटियों के लिए त्रुटि;
  • shutil.Error की प्रतिलिपि के दौरान त्रुटियों के मामले में, यह shutil.Error । अन्य उप- shutil.Error प्रतिलिपि बनाने और एकल संयुक्त shutil.Error करने की कोशिश करने के बजाय उस shutil.Error लिए shutil.Errorshutil.Error

यहां एक समाधान है जो मानक पुस्तकालय का हिस्सा है।

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

इस तरह के समान प्रश्न देखें।

निर्देशिका की सामग्री को अजगर के साथ निर्देशिका में कॉपी करें

एटजेज़ के फ़ंक्शन के मामूली सुधार में, जहां उपर्युक्त कार्य स्रोत को गंतव्य से कॉपी करने की कोशिश करता है।

 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) 

मेरे ऊपर के कार्यान्वयन में

  • आउटपुट डायरेक्टरी बनाना अगर पहले से मौजूद नहीं है
  • प्रतिलिपि निर्देशिका को अपनी पद्धति को फिर से बुलाइए।
  • जब हम वास्तव में फ़ाइल की प्रतिलिपि करने के लिए आते हैं तो मैं जांचता हूं कि फ़ाइल को संशोधित किया गया है, केवल हमें प्रतिलिपि बनाना चाहिए।

मैं स्काइन बिल्ड के साथ उपर्युक्त समारोह का उपयोग कर रहा हूं। मुझे हर बार जब मैं संकलन करता हूं तब मुझे बहुत मदद मिली, मुझे पूरे सेट फाइल की प्रतिलिपि बनाने की ज़रूरत नहीं हो। लेकिन केवल उन फ़ाइलों को संशोधित किया गया है,

एटज़ और मिटल वोरा से प्रेरित एक मर्ज:

 #!/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) 
  • शीलकॉपीट्री के समान व्यवहार, सिमुलेशन के साथ और मापदंडों को अनदेखा करना
  • यदि गैर मौजूद है तो निर्देशिका गंतव्य संरचना बनाएं
  • यदि डीएसटी पहले से मौजूद है तो विफल नहीं होगा

डॉक्स स्पष्ट रूप से बताता है कि गंतव्य निर्देशिका मौजूद नहीं होना चाहिए :

गंतव्य निर्देशिका, dst द्वारा नामित, पहले से मौजूद नहीं होनी चाहिए; इसे बनाया जाएगा साथ ही अभिभावक निर्देशिका याद आ रही है।

मुझे लगता है तुम्हारा सबसे अच्छा शर्त है कि दूसरे और सभी परिणामी निर्देशिकाओं, copy2 निर्देशिका और फाइलों को copy2 और निर्देशिकाओं के लिए अतिरिक्त copystat । सभी के ठीक बाद जो दस्तावेज में बताया गया है, copytree रूप में ठीक है। या आप प्रत्येक निर्देशिका / फ़ाइल की copy और copy सकते हैं और copystat बदले os.listdir os.walk

यह एटज़ द्वारा प्रदान किए गए मूल सर्वोत्तम उत्तर से प्रेरित है, मैं सिर्फ फ़ाइल / फ़ोल्डर तर्क को प्रतिस्थापित करता हूँ इसलिए यह वास्तव में विलय नहीं करता है, लेकिन मौजूदा फ़ाइल / फ़ोल्डर को हटाता है और एक नया प्रतिलिपि बनाता है:

 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 हटा दें।

आप shutil को संशोधित कर सकते हैं और प्रभाव प्राप्त कर सकते हैं

परिवर्तन

 os.makedirs(dst) 

सेवा मेरे

 os.makedirs(dst,exist_ok=True) 

मैं सबसे तेज़ और सरल तरीके से ग्रहण करता हूं कि अजगर सिस्टम सिस्टम को कॉल करेंगे …

उदाहरण..

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

तार और निर्देशिका को ऊपर उठाएं …. वांछित स्थान पर निर्देशिका को खोलना और खोलना।

हाँ?

यहां एक ही कार्य का मेरा संस्करण है ::

 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) 

यहां एक ऐसा संस्करण है, जो इस थ्रेड से प्रेरित है, जो दूर से distutils.file_util.copy_file नकल करता है।

updateonly केवल एक bool है अगर सच है, केवल फाइलों की संशोधित तारीखों के साथ ही forceupdate में मौजूदा फाइलों की तुलना में नई फाइलों को कॉपी करेगा, जो कि forceupdate में सूचीबद्ध नहीं है जो बिना किसी प्रतिलिपि को कॉपी करेगा।

ignore और forceupdate फ़ाइल नाम या फ़ोल्डर / forceupdate की सूची की तुलना करें और fnmatch या 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 

पिछले समाधान में कुछ समस्या है कि किसी भी अधिसूचना या अपवाद के बिना 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) 

यहाँ समस्या पर मेरा पास है मैंने मूल कार्यप्रणाली को रखने के लिए प्रतिलिपि के स्रोत कोड को संशोधित किया, लेकिन अब कोई भी त्रुटि तब नहीं आती है जब निर्देशिका पहले से मौजूद है। मैंने इसे भी बदल दिया है, इसलिए यह मौजूदा फाइलों को अधिलेखित नहीं करता है, बल्कि इन दोनों प्रतियों को बदलता है, एक संशोधित नाम के साथ, क्योंकि यह मेरे आवेदन के लिए महत्वपूर्ण था।

 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)