Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix风格的通配符重命名Python_Python_Svn_Unix - Fatal编程技术网

Unix风格的通配符重命名Python

Unix风格的通配符重命名Python,python,svn,unix,Python,Svn,Unix,我有两个实用程序函数,可以在目录中的一组项上追加或删除模式。该功能是完全相同的,除了行重命名,这使我相信我可以合并成一个功能 以下是两个功能: def append_items(source, pattern, dirs = True, recurse = False): """ Append the pattern to all items within a directory source = act on this directory pattern =

我有两个实用程序函数,可以在目录中的一组项上追加或删除模式。该功能是完全相同的,除了行重命名,这使我相信我可以合并成一个功能

以下是两个功能:

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)

有谁能告诉我一个更干净的解决方案吗?

以下内容应该与您拥有的内容相同,代码重复次数更少:

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)

作为替代方案,这里的版本将重复代码封装到一个函数中,该函数由两个特定函数参数化,一个用于重命名目录,另一个用于文件。因此,在特定的
append
/
remove
实现中,所有必须定义的都是执行特定逻辑的参数函数,然后将这些参数函数传递给
\u workon\u项

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)