我已经有了这段功能正常的代码,但在写完之后,我确实感到尖叫的冲动“它还活着,还活着!”。
我想要做的是获取具有“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的方法吗? 当然我可以检查当前的头部是否以模块结束,然后附加当前的尾部,但这只会使循环中断更快并且仍然是丑陋的。
答案 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