Source code for planetary_coverage.misc.filesize

"""File size module"""

from pathlib import Path

import numpy as np


UNITS = [
    'B',
    'kB',
    'MB',
    'GB',
    'TB',
    'PB',
]


[docs]def file_size(*fname, fmt=',.0f', skip=False) -> str: """Get filesize as human string. Parameters ---------- *fname: str or pathlib.Path Filename(s) to measure. fmt: str, optional Size format. Default: ``',.0f'``. skip: bool, optional Skip error handling and return zero-size if the file does not exists. Default: ``False``. Returns ------- str Filesize human string. If multiple files are provided, it returns the sum of their combined sizes. Raises ------ FileNotFoundError If the file does not exist. """ return as_bytes(sum(get_size(f, skip=skip) for f in fname), fmt=fmt)
[docs]def get_size(fname, skip=False) -> int: """Get filename size. Parameters ---------- fname: str or pathlib.Path File name to measure. skip: bool, optional Skip error handling and return zero-size if the file does not exists. Default: ``False``. Returns ------- int Filesize as bytes. Raises ------ FileNotFoundError If the file does not exist. """ fname = Path(fname) if not fname.is_file(): if not skip: raise FileNotFoundError(fname) return 0 return fname.stat().st_size
[docs]def as_bytes(size, fmt=',.0f'): """Convert filesize as compressed bytes units. Parameters ---------- size: int or float File size to convert. fmt: str, optional Size format to adjust the precision. Default: ``',.0f'``. Returns ------- str File size human string. """ i = int(np.ceil(np.log2(size) // 10)) if size != 0 else 0 if i >= len(UNITS): i = len(UNITS) - 1 return f'{size / 2 ** (10 * i):{fmt}} {UNITS[i]}'