Skip to main content

pathlibutil

PyPI - Python Version PyPI PyPI - Downloads PyPI - License GitHub Workflow Test) Website GitHub tag (with filter) Coverage


pathlibutil.Path inherits from pathlib.Path with some useful built-in python functions.

  • Path().hexdigest() to calculate and Path().verify() for verification of hexdigest from a file
  • Path.default_hash to configurate default hash algorithm for Path class (default: 'md5')
  • Path().size() to get size in bytes of a file or directory
  • Path().read_lines() to yield over all lines from a file until EOF
  • contextmanager to change current working directory with with statement
  • Path().copy() copy a file or directory to a new path destination
  • Path().delete() delete a file or directory-tree
  • Path().move() move a file or directory to a new path destination
  • Path().make_archive() creates and Path().unpack_archive() uncompresses an archive from a file or directory
  • Path.archive_formats to get all available archive formats

Installation

pip install pathlibutil

7zip support

to handle 7zip archives, an extra package py7zr>=0.20.2 is required!

PyPI - Version

# install as extra dependency
pip install pathlibutil[7z]

Usage

from pathlibutil import Path

readme = Path('README.md')

print(f'File size: {readme.size()} Bytes')

Example 1

Read a file and print its content and some file information to stdout.

Path().read_lines()

from pathlib import Path

readme = Path('README.md')

print('File content'.center(80, '='))

for line in readme.read_lines(encoding='utf-8'):
   print(line, end='')

print('EOF'.center(80, '='))

Example 2

Write a file with md5 checksums of all python files in the pathlibutil-directory.

Path().hexdigest()

from pathlib import Path

file = Path('pathlibutil.md5')

algorithm = file.suffix[1:]

with file.open('w') as f:
   f.write(
      f'# {algorithm} checksums generated with pathlibutil (https://pypi.org/project/pathlibutil/)\n\n')

   i = 0
   for i, filename in enumerate(Path('./pathlibutil').glob('*.py'), start=1):
      f.write(f'{filename.hexdigest(algorithm)} *{filename}\n')

print(f'\nwritten: {i:>5} {algorithm}-hashes to: {file}')

Example 3

Read a file with md5 checksums and verify them.

Path().verify(), Path.default_hash and contextmanager

from pathlib import Path

file = Path('pathlibutil.md5')

Path.default_hash = file.suffix[1:]

def no_comment(line: str) -> bool:
   return not line.startswith('#')

with file.parent as cwd:

   for line in filter(no_comment, file.read_lines()):
      try:
            digest, filename = line.strip().split(' *')
            verification = Path(filename).verify(digest)
      except ValueError as split_failed:
            continue
      except FileNotFoundError as verify_failed:
            tag = 'missing'
      else:
            tag = 'ok' if verification else 'fail

      print(f'{tag.ljust(len(digest), ".")} *{filename}')

Example 4

Search all pycache directories and free the memory.

Path().delete() and Path().size()

from pathlib import Path

mem = 0
i = 0

for i, cache in enumerate(Path('.').rglob('*/__pycache__/'), start=1):
      cache_size = cache.size()
      try:
            cache.delete(recursive=True)
      except OSError:
            print(f'Failed to delete {cache}')
      else:
            mem += cache_size

print(f'{i} cache directories deleted, {mem / 2**20:.2f} MB freed.')

Example 5

Inherit from pathlibutil.Path to register new a archive format. Specify a archive as keyword argument in the new subclass, which has to be the suffix without . of the archives. Implement a classmethod _register_archive_format() to register new archive formats.

Path().make_archive(), Path.archive_formats and Path().move()

import shutil
import pathlibutil

class RegisterFooBarFormat(pathlibutil.Path, archive='foobar'):
      @classmethod
      def _register_archive_format(cls):
      """ 
            implement new register functions for given `archive`
      """
      try:
            import <required_package_name>
      except ModuleNotFoundError:
            raise ModuleNotFoundError(
                  'pip install <required_package_name>'
            )

      def pack_foobar(base_name, base_dir, owner=None, group=None, dry_run=None, logger=None):
            """callable that will be used to unpack archives.

            Args:
                  base_name (`str`): name of the file to create
                  base_dir (`str`): directory to start archiving from, defaults to `os.curdir`
                  owner (`Any`, optional): as passed in `make_archive(*args, owner=None, **kwargs)`. Defaults to None.
                  group (`Any`, optional): as passed in `make_archive(*args, group=None, **kwargs)`. Defaults to None.
                  dry_run (`Any`, optional): as passed in `make_archive(*args, dry_run=None, **kwargs)`. 
                        Defaults to None.
                  logger (`logging.Logger`, optional): as passed in `make_archive(*args, logger=None, **kwargs)`. 
                        Defaults to None.
            """
            raise NotImplementedError('implement your own pack function')

      def unpack_foobar(archive, path, filter=None, extra_args=None):
            """callable that will be used to unpack archives. 

            Args:
                  archive (`str`): path of the archive
                  path (`str`): directory the archive must be extracted to
                  filter (`Any`, optional): as passed in `unpack_archive(*args, filter=None, **kwargs)`.
                        Defaults to None.
                  extra_args (`Sequence[Tuple[name, value]]`, optional): additional keyword arguments. 
                        as passd in `register_unpack_format(*args, extra_args=None, **kwargs)`. Defaults to None.
            """
            raise NotImplementedError('implement your own unpack function')

      shutil.register_archive_format(
            'foobar', pack_foobar, description='foobar archives'
      )
      shutil.register_unpack_format(
            'foobar', ['.foo.bar'], unpack_foobar
      )

file = pathlibutil.Path('README.md')

print(f"available archive formats: {file.archive_formats}")

archive = file.make_archive('README.foo.bar')

backup = archive.move('./backup/')

print(f'archive created: {archive.name} and moved to: {backup.parent}')

Release files for pathlibutil 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pathlibutil 0.1.3
File Size Uploaded
pathlibutil-0.1.3.tar.gz 6.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pathlibutil 0.1.3
File Interpreter ABI Platform
pathlibutil-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 14.5 kB

Release files / pathlibutil-0.1.3.tar.gz

Download URL pathlibutil-0.1.3.tar.gz
Size 6.6 kB
Tags Source
SHA-256 checksum
How to use checksums
7beab6dd89d05d8ae99d929fffa164b010a27f878d91e0b3632c866baa828717
BLAKE2b-256 checksum
How to use checksums
2ca09afcff33143315edfdf23ca7a2bb54fcc2cd9ff41373fe45ff8f76e66645
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.11.7 Linux/6.2.0-1018-azure

Release files / pathlibutil-0.1.3-py3-none-any.whl

Download URL pathlibutil-0.1.3-py3-none-any.whl
Size 7.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
808f44c296380e9d3e892e7d68fdea9ea5d7aa8eba30cc0b55f10a54d38430bb
BLAKE2b-256 checksum
How to use checksums
eab886aaf03bf318dcf652dce25a0fbb2867092219a2faa03b2f470a7a368ba1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.11.7 Linux/6.2.0-1018-azure

Release history Release notifications | RSS feed

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

1 release file

0.2.1

2 release files

0.2.0

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page