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)