You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.4 KiB
98 lines
2.4 KiB
""" Sensospot Data Parser |
|
|
|
Parsing the numerical output from Sensovations Sensospot image analysis. |
|
""" |
|
|
|
__version__ = "0.6.0" |
|
|
|
|
|
import sys |
|
from pathlib import Path |
|
|
|
import click |
|
import pandas |
|
|
|
from .parser import parse_file, parse_folder # noqa: F401 |
|
from .parameters import ExposureInfo # noqa: F401 |
|
|
|
DEFAULT_OUTPUT_FILENAME = "collected_data.csv" |
|
|
|
|
|
@click.command() |
|
@click.argument( |
|
"source", |
|
type=click.Path( |
|
exists=True, |
|
file_okay=False, |
|
dir_okay=True, |
|
readable=True, |
|
writable=True, |
|
), |
|
) |
|
@click.option( |
|
"-o", |
|
"--outfile", |
|
default=DEFAULT_OUTPUT_FILENAME, |
|
help=( |
|
"Output file name, use a dash '-' for stdout, " |
|
f"default: '{DEFAULT_OUTPUT_FILENAME}'" |
|
), |
|
) |
|
@click.option( |
|
"-q", |
|
"--quiet", |
|
is_flag=True, |
|
default=False, |
|
help="Ignore Sanity Check", |
|
) |
|
@click.option( |
|
"-r", |
|
"--recurse", |
|
is_flag=True, |
|
default=False, |
|
help="Recurse into folders one level down", |
|
) |
|
def main(source, outfile, quiet=False, recurse=False): |
|
if recurse: |
|
_parse_recursive(source, outfile, quiet) |
|
else: |
|
_parse_one_folder(source, outfile, quiet) |
|
|
|
|
|
def _output(data, folder, outfile): |
|
"""output a datafarme to stdout or csv file |
|
|
|
data: the pandas dataframe |
|
folder: the folder to save the file to |
|
outfile: the name of the outfile, '-' will output to stdout |
|
""" |
|
if outfile.strip() == "-": |
|
data.to_csv(sys.stdout, sep="\t") |
|
else: |
|
csv_file = Path(folder) / outfile |
|
data.to_csv(csv_file, sep="\t") |
|
|
|
|
|
def _parse_one_folder(source, outfile, quiet): |
|
"""parses the data of one folder""" |
|
source_path = Path(source) |
|
# read the raw data of a folder |
|
raw_data = parse_folder(source_path, quiet=quiet) |
|
_output(raw_data, source_path, outfile) |
|
return raw_data |
|
|
|
|
|
def _parse_recursive(source, outfile, quiet): |
|
"""parses all folders one level down and collects the data""" |
|
child_outfile = DEFAULT_OUTPUT_FILENAME |
|
source_path = Path(source) |
|
folders = (i for i in source_path.iterdir() if i.is_dir()) |
|
non_hidden = (i for i in folders if not i.name.startswith(".")) |
|
collection = ( |
|
_parse_one_folder(f, child_outfile, quiet) for f in non_hidden |
|
) |
|
try: |
|
collected = pandas.concat(collection, ignore_index=True) |
|
_output(collected.reset_index(), source_path, outfile) |
|
except ValueError as e: |
|
print(str(e))
|
|
|