2014-10-03 83 views
1

我想寫一個簡單的腳本來將文件從一個文件夾移動到另一個文件夾並過濾不必要的東西。我使用下面的代碼,但接收到錯誤Python shutil.ignore_patterns錯誤

import shutil 
import errno 

def copy(src, dest): 
    try: 
     shutil.copytree(src, dest, ignore=shutil.ignore_patterns('*.mp4', '*.bak')) 
    except OSError: 
     if OSError.errno == errno.ENOTDIR: 
      shutil.copy(src, dest) 
     else: 
      print("Directory not copied. Error: %s" % OSError) 

src = raw_input("Please enter a source: ") 
dest = raw_input("Please enter a destination: ") 

copy(src, dest) 

我得到的錯誤是:

Traceback (most recent call last): 
File "/Users/XXX/PycharmProjects/Folders/Fold.py", line 29, 
    in <module> 
    copy(src, dest) 
File "/Users/XXX/PycharmProjects/Folders/Fold.py", line 17, 
    in copy 
    ignore_pat = shutil.ignore_patterns('*.mp4', '*.bak') 
AttributeError: 'module' object has no attribute 'ignore_patterns' 
+0

您使用的是什麼版本的Python? 2.6中明顯增加了「ignore_patterns」。 – 2014-10-03 15:22:22

+0

謝謝,我沒有意識到我的PyCharm使用2.5.6! – Nick 2014-10-03 20:47:39

回答

1

你的Python版本太舊。來自shutil.ignore_patterns() documentation

2.6版本中的新功能。

這是很容易複製的方法,在舊版本的Python:

import fnmatch 

def ignore_patterns(*patterns): 
    """Function that can be used as copytree() ignore parameter. 

    Patterns is a sequence of glob-style patterns 
    that are used to exclude files""" 
    def _ignore_patterns(path, names): 
     ignored_names = [] 
     for pattern in patterns: 
      ignored_names.extend(fnmatch.filter(names, pattern)) 
     return set(ignored_names) 
    return _ignore_patterns 

這將會對Python的2.4和更新工作。

爲了簡化到您的特定代碼:

def copy(src, dest): 
    def ignore(path, names): 
     ignored = set() 
     for name in names: 
      if name.endswith('.mp4') or name.endswith('.bak'): 
       ignored.add(name) 
     return ignored 

    try: 
     shutil.copytree(src, dest, ignore=ignore) 
    except OSError: 
     if OSError.errno == errno.ENOTDIR: 
      shutil.copy(src, dest) 
     else: 
      print("Directory not copied. Error: %s" % OSError) 

這不使用fnmatch可言了(因爲你只是在測試的特定擴展名),並使用語法與老的Python版本兼容。

+0

謝謝,這有幫助 – Nick 2014-10-03 20:48:14