2022-12-12
Python pathlib
It's been a while since Django replaced os.path
to pathlib.Path
.
More than 3 years to be exact now that I look it up.
So I have been kind of using it in my settings.py
.
But not really.
Because once you copy and paste it that's it.
You rarely go back to touch those few lines of code in the settings file.
It was one of those things that's put in the back burner and never looked back.
Advent of Code
is helping me to learn basic Python skills and syntaxes.
Here are some pathlib
examples.
from pathlib import Path
resolve()
# Make the path absolute, resolving any symlinks. A new path object is returned >>> p = Path(".") >>> p PosixPath('.') >>> p.resolve() PosixPath('/Users/minhokim/code/adventofcode/2022') >>> pp = p / ".." / ".." >>> pp.resolve() PosixPath('/Users/minhokim/code')
navigating
>>> r = Path("/") >>> r2 = r / "etc" >>> r2 PosixPath('/etc')
exists()
>>> r2.exists() True >>> r3 = r2 / "non_existent" >>> r3 PosixPath('/etc/non_existent') >>> r3.exists() False
is_dir()/is_file()
>>> p.is_dir() True >>> p.is_file() False
cwd()
>>> cwd = Path.cwd() >>> cwd PosixPath('/Users/minhokim/code/adventofcode/2022') >>> str(cwd) '/Users/minhokim/code/adventofcode/2022'
parent
>>> cwd.resolve().parent PosixPath('/Users/minhokim/code/adventofcode')
parents
>>> list(cwd.resolve().parents) [PosixPath('/Users/minhokim/code/adventofcode'), PosixPath('/Users/minhokim/code'), PosixPath('/Users/minhokim'), PosixPath('/Users'), PosixPath('/')] >>> [*cwd.resolve().parents] [PosixPath('/Users/minhokim/code/adventofcode'), PosixPath('/Users/minhokim/code'), PosixPath('/Users/minhokim'), PosixPath('/Users'), PosixPath('/')]
iterdir()
>>> list(p.iterdir()) [PosixPath('1.py'), PosixPath('2.py')] >>> [*p.iterdir()] [PosixPath('1.py'), PosixPath('2.py')]
parts
>>> cwd.parts ('/', 'Users', 'minhokim', 'code', 'adventofcode', '2022') >>> str(cwd).split("/") ['', 'Users', 'minhokim', 'code', 'adventofcode', '2022']
root
>>> cwd.root '/'
name/suffix/suffixes/stem
>>> Path("/my/blog/post.md").name 'post.md' >>> Path("/my/blog/post.md").suffix '.md' >>> Path("/my/blog/post.md").suffixes ['.md'] >>> Path("/my/blog/post.md").stem 'post'
match(pattern)
>>> Path("/my/blog/post.md").match("*.md") True
glob(pattern)
>>> sorted(Path(".").glob("*.py")) [PosixPath('1.py'), PosixPath('2.py')]
# Use of `pathlib` in Django `settings.py` from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent STATICFILES_DIRS = [BASE_DIR / "static"]
__file__
doesn't work in REPL
>>> Path(__file__) NameError: name '__file__' is not defined.