2011-08-10 7 views
8

में अनदेखा करने के लिए कॉल बैक फ़ंक्शन कैसे लिखें, मैं पाइथन के लिए अपेक्षाकृत नया हूं। मैं संरचना को बनाए रखने के लिए एक निर्देशिका को दूसरी निर्देशिका में कॉपी करने की कोशिश कर रहा हूं।shutil.copytree

मैं उपयोग कर रहा हूँ

shutil.copytree(src, dst, symlinks=False, ignore=None, 
    copy_function=copy2, ignore_dangling_symlinks=False) 

मैं उपेक्षा के लिए एक कॉल वापस समारोह लिखने के लिए कोशिश कर रहा हूँ।

मेरा उद्देश्य एक सूची में फ़ाइलों की एक सूची लेना है, और बाकी फ़ाइलों को कॉपी करना, बाकी फ़ाइलों को कॉपी करना है। कॉल कॉल फ़ंक्शन में हम एक सूची कैसे पास करते हैं?

मैं एक साधारण कॉल बैक समारोह लिखा था, लेकिन मैं कुछ त्रुटि मिलती है जब मैं copyTree समारोह

def abc(src,names): 
    print(src) 
    print(names) 



    Traceback (most recent call last): 
    File "<pyshell#23>", line 1, in <module> 
shutil.copytree('D:\Mytest','D:\PythonTestDest3',symlinks=False,ignore=abc) 
    File "C:\Python32\lib\shutil.py", line 204, in copytree 
if name in ignored_names: 
    TypeError: argument of type 'NoneType' is not iterable 

उत्तर

7

अनदेखा फ़ंक्शन की वापसी को अनदेखा करने के लिए निर्देशिकाओं और फ़ाइलों की एक सूची होने की आवश्यकता है। आप कुछ भी वापस नहीं कर रहे हैं, जो None देता है, इसलिए आपको त्रुटि TypeError: argument of type 'NoneType' is not iterable मिल रही है।

यहाँ एक उदाहरण है कि फ़ोल्डर संरचना और 'copy_these' में सूचीबद्ध फ़ाइलों की प्रतिलिपि होगा:

import os.path 

copy_these = ['a.txt', 'b.txt', 'c.txt'] 

def ignore_most(folder, files): 

    ignore_list = [] 
    for file in files: 
     full_path = os.path.join(folder, file) 
     if not os.path.isdir(full_path): 
      if file not in copy_these: 
       ignore_list.append(file) 
    return ignore_list 
+1

आपका मतलब है कि 'f में फ़ाइलों के लिए f f = ifir (ds.path.join (फ़ोल्डर, f)) और f copy_these में नहीं है'। –

+2

अच्छी सूची समझ। लेकिन, चूंकि पूछने वाले ने कहा कि वह पाइथन के लिए नया है, और अधिक वर्बोज़ शैली को समझना और अनुकूलित करना आसान हो सकता है। – jwhitlock

6

shutil मॉड्यूल एक ignore_patterns समारोह प्रदान करता है चलाने के लिए प्रयास करें।

यह कारखाना फ़ंक्शन एक फ़ंक्शन बनाता है जिसे प्रतिलिपि() के अनदेखी तर्क के लिए कॉल करने योग्य के रूप में उपयोग किया जा सकता है, जो कि उन ग्लोब-स्टाइल पैटर्नों में से एक से मेल खाने वाली फ़ाइलों और निर्देशिकाओं को अनदेखा कर सकता है।

मॉड्यूल पृष्ठ a couple of examples भी दिखाता है।

+0

यह पूरी तरह से काम करता है यदि आप किसी फ़ाइल प्रकार को अनदेखा करने का प्रयास कर रहे हैं (जो मैं ढूंढ रहा था)। –

0

अनदेखा कॉलबैक फ़ंक्शन को 'src' निर्देशिका से संबंधित नामों की एक सूची वापस करनी चाहिए जिसे कॉपी नहीं किया जाना चाहिए।

आपका उदाहरण कॉलबैक कुछ भी नहीं देता (यानी कोई नहीं)। फिर प्रतिलिपि, एक सूची की उम्मीद, इस पर फिर से प्रयास करने की कोशिश करता है। चूंकि यह नहीं हो सकता है, आपको वह अपवाद मिलता है।

0

तो उपेक्षा दिया जाता है, यह एक प्रतिदेय कि अपने तर्कों के रूप में प्राप्त होगा होना चाहिए निर्देशिका का दौरा किया जा रहा है ... और इसकी सामग्री की एक सूची ... कॉल करने योग्य को निर्देशिका की एक अनुक्रम और वर्तमान निर्देशिका के सापेक्ष फ़ाइल नामों को वापस करना होगा ...; इन नामों को प्रतिलिपि प्रक्रिया में अनदेखा कर दिया जाएगा।

copytree(src, dest, 
     ignore=lambda d, files: [f for f in files 
            if f not in files_to_copy 
            and not is_dir(os.path.join(d, f))]) 
:

(docs)

मेरा उद्देश्य किसी सूची में फ़ाइलों की एक सूची लेने के लिए

एक गुमनाम समारोह (lambda) और एक सूची समझ प्रयास करें है

ध्यान दें कि lambda फ़ंक्शन फ़ाइलों के बेसनाम और डी प्राप्त करता है अप्रत्यक्ष, उनके पूर्ण पथ नहीं; निर्देशिका हैंडलिंग के लिए kudos @ jwhitlock है।