2010-06-19 4 views
3

прописные буквы - в чем их смысл? все, что они дают вам, это rsi.(python) рекурсивно удаляет капитализацию из структуры каталогов?

Я хотел бы удалить как можно большую капитализацию из моей структуры каталогов. как бы я написал скрипт для этого в python?

он должен рекурсивно анализировать указанный каталог, идентифицировать имена файлов/папок с прописными буквами и переименовывать их в нижнем регистре.

ответ

12

os.walk отлично подходит для выполнения рекурсивного материала с файловой системой.

import os 

def lowercase_rename(dir): 
    # renames all subforders of dir, not including dir itself 
    def rename_all(root, items): 
     for name in items: 
      try: 
       os.rename(os.path.join(root, name), 
            os.path.join(root, name.lower())) 
      except OSError: 
       pass # can't rename it, so what 

    # starts from the bottom so paths further up remain valid after renaming 
    for root, dirs, files in os.walk(dir, topdown=False): 
     rename_all(root, dirs) 
     rename_all(root, files) 

Точка ходьба дерева вверх, что, когда у вас есть структура каталогов, как «/ A/B» вы будете иметь путь «/ A» во время рекурсии тоже. Теперь, если вы начинаете сверху, сначала переименовываете/A в/a, тем самым аннулируя путь/A/B. С другой стороны, когда вы начинаете снизу и сначала переименовываете/A/B в/A/b, это не влияет на другие пути.

На самом деле вы можете использовать os.walk для сверху вниз, но это (немного) сложнее.

+1

сценарий также должен переименовывать файлы. Кроме того, меняется ли структура каталогов в середине ходьбы, запутывает функцию os.walk? –

2

попробуйте следующий сценарий:

#!/usr/bin/python 

''' 
renames files or folders, changing all uppercase characters to lowercase. 
directories will be parsed recursively. 

usage: ./changecase.py file|directory 
''' 

import sys, os 

def rename_recursive(srcpath): 
    srcpath = os.path.normpath(srcpath) 
    if os.path.isdir(srcpath): 
     # lower the case of this directory 
     newpath = name_to_lowercase(srcpath) 
     # recurse to the contents 
     for entry in os.listdir(newpath): #FIXME newpath 
      nextpath = os.path.join(newpath, entry) 
      rename_recursive(nextpath) 
    elif os.path.isfile(srcpath): # base case 
     name_to_lowercase(srcpath) 
    else: # error 
     print "bad arg: " + srcpath 
     sys.exit() 

def name_to_lowercase(srcpath): 
    srcdir, srcname = os.path.split(srcpath) 
    newname = srcname.lower() 
    if newname == srcname: 
     return srcpath 
    newpath = os.path.join(srcdir, newname) 
    print "rename " + srcpath + " to " + newpath 
    os.rename(srcpath, newpath) 
    return newpath 

arg = sys.argv[1] 
arg = os.path.expanduser(arg) 
rename_recursive(arg) 
+0

Используйте 'os.walk', чтобы упростить вашу первую функцию: http://docs.python.org/library/os.html#os.walk –

+0

Неплохое решение для чего-то, что не используется' os.walk'! :) – jathanism

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