Reputation: 839
I have looked on Stack Overflow everywhere but I cant find a solution to this problem.
Given that I have a folder/file as string: "/path1/path2/path3/file"
how can I get the parent folder and its parent folder. In other words if I want to traverse up one level "/path1/path2/path3"
or two levels "/path1/path2"
how can I get those string values from the original string path in python?
Please note that I don't simply want the pieces of the path (in other words not a list of ['path1', 'path2', 'path3']
) but instead "/path1/path2/path3"
.
Upvotes: 4
Views: 6830
Reputation: 6209
additionally to all other answers, you can also use os.path.join function with the os.path.pardir
variable which usually equals ..
.
>>> path = "some/random/path/to/process"
>>> parent = os.path.pardir
>>> grand_parent_path = os.path.join(path, parent, parent)
>>> grand_parent_path
'some/random/path/to/process\\..\\..'
If you don't want to repeat parent
several times, you can use a multipled list:
>>> os.path.join(path, *([parent] * 3))
'some/random/path/to/process\\..\\..\\..'
The result is quite ugly, so you can use the os.path.normpath function to make it prettier:
>>> os.path.normpath(os.path.join(path, *([parent] * 3)))
'some\\random'
Important note: Doing so, you are sure your code is portable
Upvotes: 4
Reputation: 102009
You can use the pathlib
module:
>>> path = pathlib.PurePath('/file1/file2/file3/file')
>>> path.parts
('/', 'file1', 'file2', 'file3', 'file')
>>> os.path.join(*path.parts[:-2])
'/file1/file2'
So just put path.parts[:-n]
for n
levels up.
Alternatively you can use the parents
attribute:
>>> path = pathlib.PurePath('/file1/file2/file3/file4/file5/file6')
>>> path.parents[0]
PurePosixPath('/file1/file2/file3/file4/file5')
>>> path.parents[1]
PurePosixPath('/file1/file2/file3/file4')
>>> path.parents[4]
PurePosixPath('/file1')
So to go up n
levels just use parents[n-1]
.
To convert a *Path
object to a string just call str
on it:
>>> str(path)
'/file1/file2/file3/file4/file5/file6'
Upvotes: 5
Reputation: 27070
os.path.dirname()
(doc) is the way to go. It returns the directory which contains the object pointed by the path:
>>> import os.path
>>> os.path.dirname('/path1/path2/path3/file')
'/path1/path2/path3'
In this case, you want the "grandparent" directory, so just use the function twice:
>>> parent = os.path.dirname('/path1/path2/path3/file')
>>> os.path.dirname(parent)
'/path1/path2'
If you want to do it an arbitrary number of times, a function can be helpful here:
def go_up(path, n):
for i in range(n):
path = os.path.dirname(path)
return path
Here are some examples:
>>> go_up('/path1/path2/path3/file', 1)
'/path1/path2/path3'
>>> go_up('/path1/path2/path3/file', 2)
'/path1/path2'
>>> go_up('/path1/path2/path3/file', 3)
'/path1'
Upvotes: 6
Reputation: 7000
'/'.join (originalPath.split ('/') [:-2])
It will take you 2 levels up.
Upvotes: 0
Reputation: 15185
os.path.split
will do it for you. There are many other interesting functions in there.
Upvotes: 1