2010-09-21 3 views
7

У меня есть следующий код Python для удаления файлов в каталоге. По какой-то причине мои .svn-каталоги не распознаются как каталоги.Python не распознает каталоги os.path.isdir()

И я получаю следующий результат:

.svn не является реж

Любые идеи будут оценены.

def rmfiles(path, pattern): 
    pattern = re.compile(pattern) 
    for each in os.listdir(path): 
     if os.path.isdir(each) != True: 
      print(each + " not a dir") 
      if pattern.search(each): 
       name = os.path.join(path, each) 
       os.remove(name) 

ответ

27

Вам нужно создать полный путь до проверки:

if not os.path.isdir(os.path.join(path, each)): 
    ... 
+0

Я потратил некоторое время на эту проблему, и выяснилось, что мне нужно использовать os.path.join(). Спасибо за совет. –

1

Вам нужно будет os.path.join пути, вы вызовете listdir на с найденным файлом/каталогом, т.е.

for each in os.listdir(path): 
    if os.path.isdir(os.path.join(path, each)): 
     .... 

Если вы не создадите абсолютный путь таким образом, вы будете тестировать вместо этого текущего рабочего каталога, что, вероятно, не будет иметь каталог svn.

Кроме того, не следует явно сравнивать логические значения. Пусть if обрабатывает его как логическое выражение (некоторые функции могут возвращать значения True/False истины, т. Е. Ни один или экземпляр)

+0

Существует метод, называемый abspath в ospath, и все же это тоже не работает для меня. Вы знаете, почему это не сработает? – vargonian

0

Вы также можете переключиться на целевой каталог, а не на создание абсолютного пути.

def rmfiles(path, pattern): 
    pattern = re.compile(pattern) 
    oldpath = os.getcwd()  # <-- 
    os.chdir(path)   # <-- 
    try: 
     for each in os.listdir('.'): 
     if os.path.isdir(each) != True: 
      print(each + " not a dir") 
      if pattern.search(each): 
       name = os.path.join(path, each) 
       os.remove(name) 
    finally: 
     os.chdir(oldpath)  # <-- 
Смежные вопросы