Как переименовать / заменить определенное ключевое слово символом Юникод для всех файлов и связанных папок?

Вот решение в Python.

#!/usr/bin/env python

def brackets_match(brackets):
    stack = []
    for char in brackets:
        if char == "{" or char == "(" or char == "[":
            stack.append(char)
        if char == "}":
            if stack[-1] == "{":
                stack.pop()
            else:
                return False
        elif char == "]":
            if stack[-1] == "[":
                stack.pop()
            else:
                return False
        elif char == ")":
            if stack[-1] == "(":
                stack.pop()
            else:
                return False
    if len(stack) == 0:
        return True
    else:
        return False

if __name__ == "__main__":
    print(brackets_match("This is testing {([])} if brackets have match."))
1
задан martineau 17 January 2019 в 00:14
поделиться

1 ответ

Есть как минимум пять вопросов:

  1. При работе с Unicode используйте его везде. os.walk будет возвращать имена файлов Unicode, если передан путь Unicode. from __future__ import unicode_literals будет по умолчанию использовать строки в Unicode.
  2. При открытии файлов закройте их. Вы столкнетесь с проблемами позже при переименовании. result все еще существует и имеет ссылку на последний открытый файл.
  3. Как уже упоминалось в комментарии, используйте os.path.join для root и file для имени до и после.
  4. Используйте os.walk с topdown=False. Сначала будут обработаны конечные узлы, поэтому дерево каталогов не будет повреждено (и сохранится root и dirs действительными) при его обходе.
  5. Сначала переименуйте файлы, затем каталоги, чтобы снова не повредить дерево каталогов при его обходе.

Результат:

from __future__ import unicode_literals

# Skipping unchanged code...

for root, dirs, files in os.walk('./input_folder'):
    for dir in dirs:
        # One way to ensure the file is closed.
        with open(os.path.join(root,dir) + '/ABC ' + str(random.randint(100,999)) + '.dat','w'):
            pass
        with open(os.path.join(root,dir) + '/XYZ-ABC ' + str(random.randint(100,999)) + '.dat','w'):
            pass

#--------------------------------------
# Main rename code

for root, dirs, files in os.walk('./input_folder',topdown=False):
    for file in files:  
        if file.endswith((".dat")):
            # Generate the full file path names.
            filename1 = os.path.join(root,file)
            filename2 = os.path.join(root,file.replace('ABC', '\u2714'))
            os.rename(filename1,filename2)
    for d in dirs:  
        # Generate the full directory path names.
        dirname1 = os.path.join(root,d)
        dirname2 = os.path.join(root,d.replace('ABC', '\u2714'))
        os.rename(dirname1,dirname2)
0
ответ дан Mark Tolonen 17 January 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: