import click import pyperclip def _strip_parts(iterable): return [item.strip() for item in iterable] def _remove_item_two(iterable): """ remove the second item from parts, it's the probe name """ copied = iterable.copy() copied.pop(1) # zero based index return copied def _replace_empty_strings(iterable, replacement="None"): return [i or replacement for i in iterable] def prepare(text): lines = text.splitlines() # replacing the german decimal separator with the standard english dot correct_separator = (l.replace(",", ".") for l in lines) parted = (l.split("\t") for l in correct_separator) stripped = (_strip_parts(l) for l in parted) no_probe_name = (_remove_item_two(l) for l in stripped) return [_replace_empty_strings(l) for l in no_probe_name] def get_cell_lengths(table): # get the max lenght of each column in_columns = zip(*table) columns_lenghts = (map(len, c) for c in in_columns) return [max(c) for c in columns_lenghts] def pad_field(index, t): value, length = t if index == 0: return value.rjust(length) else: return value.ljust(length) def pad_fields(iterable, lengths): return [pad_field(i, t) for i, t in enumerate(zip(iterable, lengths))] def build_list(table, lengths): padded = (pad_fields(l) for l in lines) padded_lines = (", ".join(l) for l in padded) lines_as_list = (f" [{l}], # noqa: E201, E202, E501," for l in padded_lines) list_content = "\n".join(lines_as_list) return f"[\n{list_content}\n]\n" @click.command() def cli(): xls = pyperclip.paste() table = split_table(xls) lengths = get_cell_lengths(table) result = build_list(table, lengths) print("copied to clipboard") pyperclip.copy(result)