用Python获取特定的父文件夹
我已经有了一段能正常工作的代码,但写完后我忍不住想大喊“它活了,它活了!”
我想做的是找到一个文件夹,它的父文件夹是“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.split('/')
数组中的 moduleDir
添加到当前的头部。
有人能告诉我有没有更好、更符合 Python 风格的方法吗?当然,我可以检查当前的头部是否以“modules”结尾,然后再添加当前的尾部,但这样只是让循环更快结束,代码看起来还是不太好。
4 个回答
1
你可以使用正则表达式
>>> import re
>>> print re.findall(r'(/.*?/modules/(.*?)/).*','/hello/modules/foo/bye')[0]
('/hello/modules/foo/', 'foo')
5
因为 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'
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