2015-06-19 2 views
0

Я пытаюсь создать следующие директории:Рекурсивных создавать каталоги в питоне, пропуская существующие каталоги

/autofs/homes/008/gwarner/test1/test2/ 

/autofs/homes/008/gwarner/test1/test3/ 

где /autofs/homes/008/gwarner/ уже существует, и у меня нет доступа на запись для всех /autofs/homes/008/. Когда я пытаюсь запустить:

dir = '/autofs/homes/008/gwarner/test/test1/test4/test5/' 

for root, dirs, files in os.walk(dir, topdown = True): 

    print root 

Я не получаю никакого вывода.

ответ

0

Вы можете использовать модули os.path.exists.

Я был бы осторожен и использовал как os.path.isdir, так и os.path.exists, чтобы проверить, является ли путь каталогом, прежде чем пытаться писать внутри каталога и os.path.exists перед переписыванием пути.

Например:

>>> import os 
>>> os.path.isdir('/home') 
True 
>>> os.path.isdir('/usr/bin') 
True 
>>> os.path.isdir('/usr/bin/python') 
False 
# writing a single, non-recursive path 
>>> if not os.path.exists('/home/cinnamon'): 
...  os.mkdir('/home/cinnamon') 
# writing a single, recursive path 
>>> if not os.path.exists('/home/alex/is/making/a/really/long/path'): 
...  os.makedirs('/home/alex/is/making/a/really/long/path') 
# now to script the latter 
>>> paths = ['/home/alex/path/one', ...] 
>>> for path in paths: 
>>>  if not os.path.exists(path): 
>>>  os.makedirs(path) 

Таким образом, вы не перезаписать что-либо существует, то проверить, если что-то каталог, прежде чем писать в каталоге. По дизайну система бросает OSError, если путь существует, поскольку он не знает, КАК вы его обрабатываете.

Вы хотите переписать путь (shutil.rmtree), хотите ли вы сохранить, что путь уже установлен, или вы хотите просто пропустить его? Это для вас, кодер, решить.

+0

Чтобы сделать это проще для всех, я урезал пути в своем вопросе. В действительности, есть сотни каталогов, которые мне нужно сделать, которые намного сложнее, чем то, что я сказал выше. При этом вручную вводить все пути невозможно. Я понимаю, что я мог бы написать код для разделения путей и делать то, что вы сказали автоматически, но я чувствую, что есть, вероятно, функция в os для этого уже. –

+0

Тогда вы хотите os.walk. Тот же принцип: Для каждого каталога, к которому вы хотите добавить путь, сначала проверьте, является ли это папкой, а затем проверьте, существует ли уже созданная вами директория, а затем создайте ее, если она не существует. os.path.exists отвечает на ваш вопрос. Тем не менее, это неполное, если только вы не знаете имя dirname для каждой папки, которую вы пишете, со 100% уверенностью, в каталоге. –

+0

Как это будет выглядеть? os.walk принимает существующий каталог, не так ли? Вход, который у меня есть, - это абсолютный путь к каталогу, который мне нужен, включая каталоги по пути, которого нет. Если я передам это os.walk(), я не получу ошибку, потому что ее не существует? –

1

Предполагаете, вы пробовали os.makedirs(), правильно? Может быть, я недоразумение ваших требований, но вы говорите, что вы хотите:

Рекурсивных создавать каталоги

и документы для os.makedirs() начинается с:

Рекурсивных функциями создания каталога.

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