From 06c48f31e1c0c871aa4a6961b8dcd7213e4c3693 Mon Sep 17 00:00:00 2001 From: Jennifer Rinker <rink@win.dtu.dk> Date: Tue, 13 Jun 2017 12:57:57 +0200 Subject: [PATCH] Initial upload of function write_master.py creates a master Excel file for automated DLB runs from a series of text files. See usage and other notes in function doc string. --- wetb/prepost/write_master.py | 121 +++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 wetb/prepost/write_master.py diff --git a/wetb/prepost/write_master.py b/wetb/prepost/write_master.py new file mode 100644 index 00000000..badf3bcd --- /dev/null +++ b/wetb/prepost/write_master.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +""" +Create a master Excel sheet from a series of text files + +Command-line usage +------------------ +$ python write_master.py [OPTIONS] + +Command line options +-------------------- + --folder (default='DLCs') + folder containing text files + --filename (default='DLCs.xlsx') + name of Excel file to save incl. extension + --fileend (default='.txt') + text file extention + --delimiter (default='\t') + character separating columns in text files + +Author: Jenni Rinker, rink@dtu.dk +""" +from __future__ import print_function +from __future__ import division +from __future__ import unicode_literals +from __future__ import absolute_import + +from argparse import ArgumentParser +import numpy as np +import os +import pandas as pd + +def write_master(path_to_texts, + excel_name='DLCs.xlsx', file_end='.txt', + delimiter='\t'): + """ Write a master Excel sheet from a series of text files + + Args: + path_to_texts (str): path to directory with text files + excel_name (str): filename of generated master Excel file + file_end (str): file ending of text files + delimiter (str): column delimiter in text files + """ + + # formatting for header cells + header_dict = {'bold': True, 'font_color': '#1F497D', + 'bottom': 2, 'bottom_color': '#95B3D7'} + + # get list of text files + text_files = [f for f in os.listdir(path_to_texts) \ + if f.endswith(file_end)] + + # check if main text file in the specified directory + if 'Main'+file_end not in text_files: + raise ValueError('\"Main\" file not in CSV directory') + + # rearrange text files so main page is first and everything + # else is alphabetical + text_files.remove('Main'+file_end) + text_files = ['Main'+file_end] + sorted(text_files) + + # open excel file + writer = pd.ExcelWriter(excel_name, engine='xlsxwriter') + + # create workbook and add formast + workbook = writer.book + header = workbook.add_format(header_dict) + + # loop through text files + for text_name in text_files: + + # define path to csv file + text_path = os.path.join(path_to_texts,text_name) + + # read data, write to Excel file, and define worksheet handle + text_df = pd.read_table(text_path, + delimiter=delimiter, dtype=str, + header=None) + text_df.to_excel(writer, sheet_name=text_name.rstrip(file_end), + index=False, header=False) + worksheet = writer.sheets[text_name.rstrip(file_end)] + + # get column widths by calculating max string lenths + col_widths = text_df.apply(lambda x: np.max([len(str(s)) for s in x])) + + # add formatting + for i_col, width in enumerate(col_widths): + worksheet.set_column(i_col, i_col, width) + if 'Main' in text_name: # hardcode first column on main tab + worksheet.set_column('A:A', 16.56) + for i_row in [6,9,13,18,24,28]: + worksheet.set_row(i_row, cell_format=header) + else: + worksheet.set_row(1, cell_format=header) + worksheet.set_zoom(zoom=85) + + # save worksheet + writer.save() + + return + +if __name__ == '__main__': + + # define argument parser + parser = ArgumentParser(description="generator of master excel sheet") + parser.add_argument('--folder', type=str, default='DLCs', action='store', + dest='folder', help='Destination folder name') + parser.add_argument('--filename', type=str, default='DLCs.xlsx', + action='store', dest='filename', + help='Master spreadsheet file name') + parser.add_argument('--fileend', type=str, default='.txt', + action='store', dest='fileend', + help='File extension for fileend files') + parser.add_argument('--delimiter', type=str, default='\t', + action='store', dest='delimiter', + help='Text delimiter in files') + opt = parser.parse_args() + + # write master Excel files + write_master(opt.folder, + excel_name=opt.filename, file_end=opt.fileend, + delimiter=opt.delimiter) -- GitLab