使用Python获取特定的父文件夹

时间:2011-05-16 10:00:06

标签: python path directory

我已经有了这段功能正常的代码,但在写完之后,我确实感到尖叫的冲动“它还活着,还活着!”。

我想要做的是获取具有“modules”文件夹作为其父文件夹的文件夹,例如来自/ home / user / puppet / modules / impuls-test / templates / apache22 /我想/ home / user / puppet / modules / impuls-test /

我想出的是以下内容:

user@server:~/puppet/modules/impuls-test/templates/apache22$ python
Python 2.4.2 (#1, Apr 13 2007, 15:38:32)
[GCC 4.1.0 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> cwd = os.getcwd()
>>> path = cwd
>>> print "cwd: %s" % cwd
cwd: /home/user/puppet/modules/impuls-test/templates/apache22
>>> for i in xrange(len(cwd.split('/'))):
...     (head, tail) = os.path.split(path)
...     print "head: %s" % head
...     print "tail: %s" % tail
...     if tail == 'modules':
...         moduleDir = head + '/modules/' + cwd.split('/')[i+2] + '/'
...         print "moduleDir: %s" % moduleDir
...         break
...     else:
...         path = head
...
head: /home/user/puppet/modules/impuls-test/templates
tail: apache22
head: /home/user/puppet/modules/impuls-test
tail: templates
head: /home/user/puppet/modules
tail: impuls-test
head: /home/user/puppet
tail: modules
moduleDir: /home/user/puppet/modules/impuls-test/

我得到当前的工作目录并使用os.path.split这么久,直到它到达modules文件夹。使用普通string.split函数迭代cwd,然后我可以将原始moduleDir数组中的cwd.split('/')附加到当前头部。

有人可以告诉我一个更好/ pythonic的方法吗? 当然我可以检查当前的头部是否以模块结束,然后附加当前的尾部,但这只会使循环中断更快并且仍然是丑陋的。

4 个答案:

答案 0 :(得分:8)

path = "/home/user/puppet/modules/impuls-test/templates"
components = path.split(os.sep)
print str.join(os.sep, components[:components.index("modules")+2])

打印

/home/user/puppet/modules/impuls-test

答案 1 :(得分:3)

由于os.path.normpath处理“..”运算符,你可以直接使用“..”并让normpath完成工作:

>>> path = "/home/user/puppet/modules/impuls-test/templates"
>>> os.path.normpath(os.path.join(path, ".."))
'/home/user/puppet/modules/impuls-test'

答案 2 :(得分:1)

您可以使用正则表达式

>>> import re
>>> print re.findall(r'(/.*?/modules/(.*?)/).*','/hello/modules/foo/bye')[0]
('/hello/modules/foo/', 'foo')

答案 3 :(得分:0)

Sven's (original) answer类似,但更具便携性和错误处理......

>>> import os
>>> cwd = '/home/user/puppet/modules/impuls-test/templates/apache22'
>>> directories = cwd.split(os.sep)
>>> try:
...     modules_depth = directories.index('modules')
...     print(os.sep.join(directories[:modules_depth + 2]))
... except ValueError:
...     print('Could not find "modules"')
... 
/home/user/puppet/modules/impuls-test