Получение определенной родительской папки с Python - PullRequest
2 голосов
/ 16 мая 2011

У меня уже есть этот функционирующий код, но после его написания я почувствовал желание закричать: «Он жив, он жив!».

То, что я хочу сделать, - это получить папку, в которой папка «modules» является ее родительской папкой, например от / дома / пользователь / кукольный / модули / импульсный тест / шаблоны / apache22 / я хочу / домой / пользователь / кукольный / модули / импульсный тест /

Я придумал следующее:

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 до тех пор, пока он не достигнет папки модулей. Используя обычную функцию string.split для перебора cwd, я могу затем добавить moduleDir из исходного массива cwd.split('/') к текущей голове.

Может кто-нибудь сказать мне лучший / питонский способ сделать это? Конечно, я могу проверить, заканчивается ли текущая головка модулями, а затем добавить текущий хвост, но это только сделает разрыв цикла более быстрым и все равно будет уродливым.

Ответы [ 4 ]

8 голосов
/ 16 мая 2011
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
3 голосов
/ 01 ноября 2011

Поскольку 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'
1 голос
/ 16 мая 2011

Вы можете использовать регулярное выражение

>>> import re
>>> print re.findall(r'(/.*?/modules/(.*?)/).*','/hello/modules/foo/bye')[0]
('/hello/modules/foo/', 'foo')
0 голосов
/ 16 мая 2011

Аналогично (оригинальному) ответу Свена , но более переносимо и с обработкой ошибок ...

>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...