2015-06-19 61 views
0

我试图创建以下目录:递归在Python中创建的目录,而跳过现有目录

/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()打头:

递归目录创建功能。