Skip to content

gpcimino/pathlibext

Repository files navigation

Pathlib Extensions

example workflow

Add convenience methods to Python Pathlib via monkey patching.

Installation

Pathlibext is available in PyPI. To Install it use pip:

pip install pathlibext

Usage

Just import pathlibext once and the Path class will be extended with a series of convenience methods:

from pathlib import Path
import pathlibext  # pylint: disable=unused-import


if __name__ == '__main__':

    tmp = Path.tmpdir()  # from pathlibext
    print(f"Create temp directory {tmp}")

    for f in [
        tmp / "dir1" / "a.txt",
        tmp / "dir1" / "b.txt",
        tmp / "dir2" / "a.txt",
        tmp / "dir2" / "b.txt",
    ]:
        f.parent.mkdir(exist_ok=True)
        f.touch()
        print(f"Create file {f}")
    

    for d in tmp.find(type_="d", name="dir2"): # from pathlibext
        d.rmtree() # from pathlibext
        print(f"Remove non-empty directory {d}")

    print("Existing directories after rmtree()")
    for d in tmp.find(type_="d"): # from pathlibext
        print(f"{d}")

    tmp.rmtree() # from pathlibext
    print(f"Remove non-empty temp dir {tmp}")

List of pathlibext methods

find

Extends the Path object with find method which resembles POSIX find. The find method returns a generator.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

print(list(Path(".").resolve().find("f", name="*.py", maxdepth=4)))

match

Test whether the Path object matches the pattern string, returning a boolean. Match is not case sensitive on Windows.
Same as fnmatch.match.

import os
from pathlib import Path
import pathlibext  # pylint: disable=unused-import

print(Path("/foo/BAR.txt").match("*BAR*")) # True

if os.name == "nt":
    # On windows match() is case insensitive
    print(Path("/foo/BAR.txt").match("*bar*")) # True
else:
    # On POSIX match() is case sensitive
    print(Path("/foo/BAR.txt").match("*bar*")) # False

matchcase

Test whether the Path object matches pattern, returning boolean. The comparison is case-sensitive. Same as fnmatch.macthcase.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

print(Path("/foo/BAR.txt").matchcase("*BAR*")) # True
print(Path("/foo/BAR.txt").matchcase("*bar*")) # False

rmtree

Delete non empty directory tree starting from the root represented as Path object.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

tmp = Path.tmpdir()
f = tmp / "foo" / "test.txt"
d = f.parent
d.mkdir()
f.touch() # touchpath !
tmp.rmtree()
print(f.exists()) # False
print(d.exists()) # False

copy and copy_preserve_metadata

Copies the file represented as Path object to destination file or directory provided as Path object. Same as shutil.copy. To preserve metadata use copy_preserve_metadata() which is imlpemented with shutil.copy2.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

src = Path.tmpdir() 
dst =  Path.tmpdir() 
f = src / "test.txt"
f.touch()

copied = f.copy(dst)

print(f.exists()) # True
print(copied.exists()) # True

src.rmtree() # cleanup
dst.rmtree() # cleanup

move

Move the file represented by the Path object to another location again represented as Path object. It is implemented with shutil.move.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

src = Path.tmpdir() 
dst =  Path.tmpdir() 
f = src / "test.txt"
f.touch()

moved = f.move(dst)

print(f.exists()) # False
print(moved.exists()) # True

src.rmtree() # cleanup
dst.rmtree() # cleanup

size

Return the file size in bytes or in the specified unit of measure. Short hand for Path.stat().st_size.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

f = Path.tmpdir() / "test.txt"
f.write_text("abc")
print(f.size()) # 3
print(f.size("MB")) # 2.86102294921875e-06

access_time, modification_time, creation_time and metadatachange_time

access_time() and modification_time() are short hand methods for Path().stat().st_atime and Path().stat().st_mtime.

creation_time() is available only on Windows and returns the file creation, same as Path().stat().st_ctime.

metadatachange_time() is available only on POSIX and returns the file metadata change time, same as Path().stat().st_ctime.

All methods and are wrapper around Path().stat().

CAUTION! All methods return time as datetime objects and are local time.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

f = Path.tmpfile() 
f.write_text("abc")
print(f.access_time()) 
f.unlink()

systmpdir

Return OS temporary directory as Path.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

print(Path.systmpdir()) # Path('/tmp')

tmpdir

Return a temporary directory as Path. This is a wrapper of tempfile.mkdtemp.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

print(Path.tmpdir())

tmpdir_in

Creates a temporary directory as Path object inside an existing directory represented as Path.

from pathlib import Path
import pathlibext  # pylint: disable=unused-import

print(Path("/tmp").tmpdir_in())

current_file_path

Convinient method to get the file path as Path object of the currently executed file. See examples/current_file.py on how to use it.

current_file_dir

Convinient method to get the directory as Path object of the currently executed file. See examples/current_file.py on how to use it.

About

Extends the functionalities of Python Pathlib

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published