Я создал декоратор для обхода каталогов для нескольких функций для выполнения некоторых файловых операций.Каждый раз, когда в сценарии выполняется более одной функции с декоратором, выполняется только первая.
import os
import re
import sys
def oswalk_deco(func):
def wrapper(filename, *args):
subdirs = [os.path.abspath(x[0]) for x in os.walk(target_dir)]
subdirs.remove(os.path.abspath(target_dir))
for dir in subdirs:
os.chdir(dir)
for item in os.listdir('.'):
p = re.match(filename, item)
if isinstance(p, re.Match):
match = p.group()
func(match, *args)
return wrapper
def str2uni(string):
if isinstance(string, str):
return string.encode('utf8').decode('unicode_escape')
else:
print('Function "str2uni(string)" only accept strings.')
exit()
@oswalk_deco
def sub_string(filename, regex, substr):
with open(filename, 'r') as file:
content = file.read()
with open(filename, 'w') as file:
content = re.sub(regex, substr, content)
file.write(content)
@oswalk_deco
def regex_print(filename, string):
with open(filename, 'r') as file:
content = file.read()
relist = re.findall(string, content)
if filename[0] == 'u':
print({str2uni(f'\\u{filename[1:-4]}'): relist})
elif isinstance(re.match(r'code\d{2}-u.+', filename), re.Match):
print({str2uni(f'\\{re.search("u[0-9a-z]{4,5}", filename).group()}'): relist})
@oswalk_deco
def docname_format(filename):
with open(filename, 'r') as file:
content = file.read()
with open(filename, 'w') as file:
content = re.sub(r'docname=".*"', f'docname="{filename}"', content)
file.write(content)
if __name__ == '__main__':
if len(sys.argv) == 1:
target_dir = '.'
else:
target_dir = sys.argv[1]
regex_print('.*\.svg', 'docname=".*"')
regex_print('.*\.svg', 'stroke:none')
sub_string('.*\.svg', 'docname=".*"', 'docname="stackoverflow.svg')
Кажется, я пропустил некоторые важные свойства в Python?