Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting a specific parent folder with Python

I already have this piece of functioning code, but after writing it I did feel the urge to scream "It's alive, it's alive!".

What I want to do is get the folder which has the folder "modules" as its parent folder, e.g. from /home/user/puppet/modules/impuls-test/templates/apache22/ I want /home/user/puppet/modules/impuls-test/

What I came up with is the following:

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/

I get the current working directory and use the os.path.split so long until it reaches the modules folder. Using the normal string.split function to iterate over the cwd, I can then append the moduleDir from the original cwd.split('/') array to the current head.

Can someone tell me a better/pythonic way to do this? Sure I can check if the current head ends with modules and then append the current tail, but that would only make the loop break faster and would still be ugly.

like image 839
xorpaul Avatar asked Apr 20 '26 21:04

xorpaul


1 Answers

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

prints

/home/user/puppet/modules/impuls-test
like image 55
Sven Marnach Avatar answered Apr 23 '26 12:04

Sven Marnach



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!