How to get folder name, in which given file resides, from pathlib.path?
Question:
Is there something similar to os.path.dirname(path)
, but in pathlib?
Answers:
It looks like there is a parents
element that contains all the parent directories of a given path. E.g., if you start with:
>>> import pathlib
>>> p = pathlib.Path('/path/to/my/file')
Then p.parents[0]
is the directory containing file
:
>>> p.parents[0]
PosixPath('/path/to/my')
…and p.parents[1]
will be the next directory up:
>>> p.parents[1]
PosixPath('/path/to')
Etc.
p.parent
is another way to ask for p.parents[0]
. You can convert a Path
into a string and get pretty much what you would expect:
>>> str(p.parent)
'/path/to/my'
And also on any Path
you can use the .absolute()
method to get an absolute path:
>>> os.chdir('/etc')
>>> p = pathlib.Path('../relative/path')
>>> str(p.parent)
'../relative'
>>> str(p.parent.absolute())
'/etc/../relative'
Note that os.path.dirname
and pathlib
treat paths with a trailing slash differently. The pathlib
parent of some/path/
is some
:
>>> p = pathlib.Path('some/path/')
>>> p.parent
PosixPath('some')
While os.path.dirname
on some/path/
returns some/path
:
>>> os.path.dirname('some/path/')
'some/path'
I came here looking for something very similar. My solution, based on the above by @larsks, and assuming you want to preserve the entire path except the filename, is to do:
>>> import pathlib
>>> p = pathlib.Path('/path/to/my/file')
>>> pathlib.Path('/'.join(list(p.parts)[1:-1])+'/')
Essentially, list(p.parts)[1:-1]
creates a list of Path elements, starting from the second to n-1th, and you join them with a ‘/’ and make a path of the resulting string. Edit The final +’/’ adds in the trailing slash – adjust as required.
summary
from pathlib import Path
file_path = Path("/Users/yuanz/PycharmProjects/workenv/little_code/code09/sample.csv")
1. get dir path
file_path.parent
# >>> /Users/yuanz/PycharmProjects/workenv/little_code/code09
2. get filename
file_path.name
# >>> sample.csv
3. get file type
file_path.suffix
# >>> .csv
4.add new file in this dir path
file_path.parent.joinpath("dd.png")
Is there something similar to os.path.dirname(path)
, but in pathlib?
It looks like there is a parents
element that contains all the parent directories of a given path. E.g., if you start with:
>>> import pathlib
>>> p = pathlib.Path('/path/to/my/file')
Then p.parents[0]
is the directory containing file
:
>>> p.parents[0]
PosixPath('/path/to/my')
…and p.parents[1]
will be the next directory up:
>>> p.parents[1]
PosixPath('/path/to')
Etc.
p.parent
is another way to ask for p.parents[0]
. You can convert a Path
into a string and get pretty much what you would expect:
>>> str(p.parent)
'/path/to/my'
And also on any Path
you can use the .absolute()
method to get an absolute path:
>>> os.chdir('/etc')
>>> p = pathlib.Path('../relative/path')
>>> str(p.parent)
'../relative'
>>> str(p.parent.absolute())
'/etc/../relative'
Note that os.path.dirname
and pathlib
treat paths with a trailing slash differently. The pathlib
parent of some/path/
is some
:
>>> p = pathlib.Path('some/path/')
>>> p.parent
PosixPath('some')
While os.path.dirname
on some/path/
returns some/path
:
>>> os.path.dirname('some/path/')
'some/path'
I came here looking for something very similar. My solution, based on the above by @larsks, and assuming you want to preserve the entire path except the filename, is to do:
>>> import pathlib
>>> p = pathlib.Path('/path/to/my/file')
>>> pathlib.Path('/'.join(list(p.parts)[1:-1])+'/')
Essentially, list(p.parts)[1:-1]
creates a list of Path elements, starting from the second to n-1th, and you join them with a ‘/’ and make a path of the resulting string. Edit The final +’/’ adds in the trailing slash – adjust as required.
summary
from pathlib import Path
file_path = Path("/Users/yuanz/PycharmProjects/workenv/little_code/code09/sample.csv")
1. get dir path
file_path.parent
# >>> /Users/yuanz/PycharmProjects/workenv/little_code/code09
2. get filename
file_path.name
# >>> sample.csv
3. get file type
file_path.suffix
# >>> .csv
4.add new file in this dir path
file_path.parent.joinpath("dd.png")