Как пропустить каталоги .hg / .git / .svn при рекурсии дерева в python

#python #directory #os.walk

#python #каталог #os.walk

Вопрос:

У меня есть скрипт на python, который я собирал по кусочкам (один из моих первых набегов на python).

Скрипт рекурсирует папку в поисках файлов проекта XCode; скрипт работает нормально, но я хотел бы адаптировать его для пропуска любых папок .svn (или .hg или .git), чтобы он не пытался изменять исходные репозитории.

Вот скрипт для рекурсивного поиска

 for root, dirnames, files in os.walk('.'):
    files = [f for f in files if re.search("project.pbxproj", f)]
    for f in files:
        filename = os.path.join(root, f)
        print "Adjusting BaseSDK for %s" % (filename)
        ...
  

Как я могу исключить поддеревья репозитория?

Комментарии:

1. Вы смотрели на ОС. пройтись по документации? docs.python.org/library/os.html#os.walk . Точное решение содержится в документации. dirnames.remove(".svn")

2. Просто наткнулся здесь, поскольку я хотел удалить все файлы .svn в проекте, команда svn export просто делает это без необходимости скрипта (в hg amp; git есть только одна папка в корне проекта, которую вы должны удалить).

3. @S.Lott Спасибо, что указали место в документации; не уверен, почему я пропустил это раньше.

Ответ №1:

Как говорит С. Лотт в своем комментарии, это упоминается в документации для os.walk . Следующее должно работать нормально:

 for root, dirs, files in os.walk("."):
    if ".hg" in dirs:
        dirs.remove(".hg")
    for f in files:
        print os.path.join(root, f)
  

Ответ №2:

Перед обработкой файла вы можете проверить, начинается ли первый символ в имени файла с «.», если это так, перейдите к следующему элементу цикла.

 for root, dirnames, files in os.walk('.'):
    files = [f for f in files if re.search("project.pbxproj", f)]
    for f in files:
        ### EDIT START
        if f[0] == ".":
            continue
        ### EDIT FINISH

        filename = os.path.join(root, f)
        print "Adjusting BaseSDK for %s" % (filename)
  

Комментарии:

1. .hg, .git, .svn — это папки. Также смотрите комментарий, о котором идет речь выше.