2012-10-11 58 views
0

我有兩個實用函數,可以將一個模式追加或刪除到目錄中的一組項目。除了重命名之外,其功能與完全相同,這使得我相信我可以將它們合併爲一個函數。Unix風格通配符重命名Python

這裏有兩個功能:

def append_items(source, pattern, dirs = True, recurse = False): 
    """ 
    Append the pattern to all items within a directory 

    source = act on this directory 
    pattern = add this to the start of the file 
    dirs = apply to directorys 
    recurse = work recursively 
    """ 
    for item in os.listdir(source): 
     path = os.path.join(source, item) 
     if "svn" not in item: 
      if os.path.isdir(path): 
       # Recurse first 
       if recurse: 
        append_items(path, pattern, dirs, recurse) 
       if dirs: 
        rename(path, path + pattern) 
      elif os.path.isfile(path): 
       name, ext = os.path.splitext(item) 
       # Append pattern, add extension back 
       new_path = os.path.join(source, "%s%s" % (name, pattern) + ext) 
       rename(path, new_path) 

#---------------------------------------------------------------------------------------------------------- 

def remove_string_from_items(source, pattern, dirs = True, recurse = False): 
    """ 
    Remove a pattern from all items within a directory 

    source = directory 
    pattern = text to replace 
    """ 
    for item in os.listdir(source): 
     path = os.path.join(source, item) 
     if "svn" not in item: 
      if os.path.isdir(path): 
       # Recurse first 
       if recurse: 
        remove_string_from_items(path, pattern, dirs, recurse) 
       if dirs and pattern in item: 
        target = os.path.join(source, string.replace(item, pattern, "")) 
        rename(path, target) 
      elif os.path.isfile(path) and pattern in item: 
       target = os.path.join(source, string.replace(item, pattern, "")) 
       rename(path, target) 

可有人點我對一個更清潔的解決方案?

回答

1

下應該相當於你有什麼,用更少的重複代碼:

def _append_or_remove(source, pattern, dirs = True, recurse = False, append = True): 
    for item in os.listdir(source): 
     path = os.path.join(source, item) 
     if "svn" not in item: 
      if os.path.isdir(path): 
       # Recurse first 
       if recurse: 
        if append: 
         append_items(path, pattern, dirs, recurse) 
        else: 
         remove_string_from_items(path, pattern, dirs, recurse) 
       if dirs and pattern in item: 
        target = os.path.join(source, string.replace(item, pattern, "")) 
        rename(path, target) 
      elif os.path.isfile(path) and pattern in item: 
       if append: 
        name, ext = os.path.splitext(item) 
        # Append pattern, add extension back 
        target = os.path.join(source, "%s%s" % (name, pattern) + ext) 
       else: 
        target = os.path.join(source, string.replace(item, pattern, "")) 
       rename(path, target) 

def append_items(source, pattern, dirs = True, recurse = False): 
    """ 
    Append the pattern to all items within a directory 

    source = act on this directory 
    pattern = add this to the start of the file 
    dirs = apply to directorys 
    recurse = work recursively 
    """ 
    return _append_or_remove(source, pattern, dirs, recurse, True) 

def remove_string_from_items(source, pattern, dirs = True, recurse = False): 
    """ 
    Remove a pattern from all items within a directory 

    source = directory 
    pattern = text to replace 
    """ 
    return _append_or_remove(source, pattern, dirs, recurse, False) 
0

作爲替代,這裏是封裝了重複的代碼到由兩個特定的功能參數化的功能的版本,一個用於重命名目錄,另一個用於文件。因此,在具體的實現中,所有必須定義的是執行特定邏輯的參數函數,然後將其傳遞給_workon_items

def append_items(source, pattern, dirs = True, recurse = False): 
    """ 
    Append the pattern to all items within a directory 

    source = act on this directory 
    pattern = add this to the start of the file 
    dirs = apply to directorys 
    recurse = work recursively 
    """ 
    def dir_rename(path, pattern, source, item): 
     rename(path, path + pattern) 

    def file_rename(path, pattern, source, item): 
     name, ext = os.path.splitext(item) 
     # Append pattern, add extension back 
     new_path = os.path.join(source, "%s%s" % (name, pattern) + ext) 
     rename(path, new_path) 

    _workon_items(dir_rename, file_rename, source, pattern, dirs, recurse) 

#---------------------------------------------------------------------------------------------------------- 

def remove_string_from_items(source, pattern, dirs = True, recurse = False): 
    """ 
    Remove a pattern from all items within a directory 

    source = directory 
    pattern = text to replace 
    """ 
    def dir_rename(path, pattern, source, item): 
     if pattern in item: 
      target = os.path.join(source, string.replace(item, pattern, "")) 
      rename(path, target) 

    def file_rename(path, pattern, source, item): 
     if pattern in item: 
      target = os.path.join(source, string.replace(item, pattern, "")) 
      rename(path, target) 

    _workon_items(dir_rename, file_rename, source, pattern, dirs, recurse) 

#---------------------------------------------------------------------------------------------------------- 

def _workon_items(dir_rename, file_rename, source, pattern, dirs, recurse): 
    for item in os.listdir(source): 
     path = os.path.join(source, item) 
     if "svn" not in item: 
      if os.path.isdir(path): 
       # Recurse first 
       if recurse: 
        _workon_items(dir_rename, file_rename, path, pattern, dirs, recurse) 
       if dirs: 
        dir_rename(path, pattern, source, item) 
      elif os.path.isfile(path): 
       file_rename(path, pattern, source, item)