2014-01-10 2 views
3

Я использую shutil.rmtree для удаления каталога, но другие процессы (которые я не контролирую), которые создают файлы в этом дереве, не могут создавать файлы, потому что каталогов не существует. Есть ли что-то такое же простое, как shutil.rmtree, которое удаляет только файлы, но сохраняет структуру каталогов?shutil.rmtree только для удаления файлов?

ответ

3

Я не думаю, что есть встроенная функция, чтобы сделать это, но вы легко можете сделать это самостоятельно с помощью os.walk():

for dirpath, dirnames, filenames in os.walk(my_directory): 
    # Remove regular files, ignore directories 
    for filename in filenames: 
     os.unlink(os.path.join(dirpath, filename)) 
+0

Я думаю, что вам нужно 'os.path.join (my_directory, dirpath, имя файла)', не так ли? – zwol

+0

Не в соответствии с [os.walk] (документация). Соответствующий фрагмент _ Чтобы получить полный путь (который начинается с вершины) к файлу или каталогу в dirpath, выполните os.path.join (dirpath, name) ._ – alejandro

0

Если вы хотите сделать это в одной строке, и у вас есть GNU найти, аутсорсинг:

subprocess.check_call(["find", "-H", directory, "!", "-type", "d", "-delete"]) 

Это также имеет то преимущество, что было очень тщательно закодированы специалистами, чтобы избежать ряда условий гонки, которые могут позволить вредоносный процесс на ту же систему, чтобы обмануть ваш процесс удаления что-то он не должен Не знаю. Я не думаю, что на самом деле можно избежать всех этих рас, используя os.walk; вам нужен API, который позволяет использовать unlinkat или fchdir.

0

, как о чем-то вроде этого:

import os 

def rm_files_in_tree(dir): 
    for root, dirs, files in os.walk(dir): 
     for file in files: 
      path = os.path.abspath(os.path.join(root, file)) 
      os.remove(path) 
Смежные вопросы