inherits from pathlib.Path with methods for hashing, copying, deleting and more
Project description
pathlibutil
pathlibutil.Path
inherits from pathlib.Path
with some useful built-in python functions.
Path().hexdigest()
to calculate andPath().verify()
for verification of hexdigest from a filePath.default_hash
to configurate default hash algorithm forPath
class (default: 'md5')Path().size()
to get size in bytes of a file or directoryPath().read_lines()
to yield over all lines from a file until EOFcontextmanager
to change current working directory withwith
statementPath().copy()
copy a file or directory to a new path destinationPath().delete()
delete a file or directory-treePath().move()
move a file or directory to a new path destinationPath().make_archive()
creates andPath().unpack_archive()
uncompresses an archive from a file or directoryPath.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!
# 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
andcontextmanager
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()
andPath().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
andPath().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}')
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for pathlibutil-0.1.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 808f44c296380e9d3e892e7d68fdea9ea5d7aa8eba30cc0b55f10a54d38430bb |
|
MD5 | 9f06bc0a74a9f0ed4afe02fbf9d33cab |
|
BLAKE2b-256 | eab886aaf03bf318dcf652dce25a0fbb2867092219a2faa03b2f470a7a368ba1 |