2013-12-12 3 views
1

Я пишу программу, которая переименовывает файлы и каталоги, вынимая определенный шаблон. Моя функция переименования хорошо работает для файлов, так как os.walk() предназначена для всех файлов, но не столько с каталогамиPython - рекурсивный каталог с помощью os.walk()

for root, dirs, files in os.walk(path):    # Listing the files 
     for i, foldername in enumerate(dirs): 
      output = foldername.replace(pattern, "") # Taking out pattern 
      if output != foldername: 
       os.rename(       # Renaming 
        os.path.join(path, foldername), 
        os.path.join(path, output)) 
      else: 
       pass 

Может кто-то предложить решение охватить все каталоги, а не только те, первый уровня?

+0

set 'topdown = False', чтобы посетить верхние каталоги верхнего уровня. – jfs

+0

Также правильный путь должен использовать 'root':' os.path.join (root, foldername) ' – jfs

+0

Путь! Оба комментария прямо на месте. Сделайте это ответом, чтобы я мог пометить его! – baldurmen

ответ

2

Установка topdown=False в os.walk делает трюк

for root, dirs, files in os.walk(path, topdown=False): # Listing the files 
    for i, name in enumerate(dirs): 
     output = name.replace(pattern, "")    # Taking out pattern 
     if output != name: 
      os.rename(         # Renaming 
       os.path.join(root, name), 
       os.path.join(root, output)) 
     else: 
      pass 

Благодаря J.F Sebastian!

0

Это будет делать трюк (pymillsutils.getFiles()):

def getFiles(root, pattern=".*", tests=[isfile], **kwargs): 
    """getFiles(root, pattern=".*", tests=[isfile], **kwargs) -> list of files 

    Return a list of files in the specified path (root) 
    applying the predicates listed in tests returning 
    only the files that match the pattern. Some optional 
    kwargs can be specified: 

    * full=True  (Return full paths) 
    * recursive=True (Recursive mode) 
    """ 

    def test(file, tests): 
     for test in tests: 
      if not test(file): 
       return False 
     return True 

    full = kwargs.get("full", False) 
    recursive = kwargs.get("recursive", False) 

    files = [] 

    for file in os.listdir(root): 
     path = os.path.abspath(os.path.join(root, file)) 
     if os.path.isdir(path): 
      if recursive: 
       files.extend(getFiles(path, pattern, **kwargs)) 
     elif test(path, tests) and re.match(pattern, path): 
      if full: 
       files.append(path) 
      else: 
       files.append(file) 

    return files 

Использование:

getFiles("*.txt", recursive=True) 

Чтобы перечислить только каталоги:

from os.path import isdir 

getFiles("*.*", tests=[isdir], recursive=True) 

Там также хороший OOP- библиотеку стиля для манипуляций с траекторией и обхода, называемой py, который имеет действительно хороший API (-ы), который мне очень нравится и используется во всех моих проектах.

+0

Хммм, не так уверен ... Я пытаюсь настроить таргетинг на каталоги, а не на файлы. os.walk() отлично работает для файлов, это не моя проблема. – baldurmen

+0

Функция поддерживает обход и список каталогов и файлов. –

Смежные вопросы