Passed
Push — development/test ( 9ec173...0a179d )
by Daniel
01:27
created

DataInputOutput.fn_file_save_error_logger()   A

Complexity

Conditions 2

Size

Total Lines 14
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 13
dl 0
loc 14
rs 9.75
c 0
b 0
f 0
cc 2
nop 4
1
"""
2
Data Input Output class
3
"""
4
# package to add support for multi-language (i18n)
5
import gettext
6
# package to handle files/folders and related metadata/operations
7
import os
8
# package facilitating Data Frames manipulation
9
import pandas as pd
10
11
12
class DataInputOutput:
13
    lcl = None
14
15
    def __init__(self, default_language='en_US'):
16
        current_script = os.path.basename(__file__).replace('.py', '')
17
        lang_folder = os.path.join(os.path.dirname(__file__), current_script + '_Locale')
18
        self.lcl = gettext.translation(current_script, lang_folder, languages=[default_language])
19
20
    def fn_file_save_error_logger(self, local_logger, in_file_details, error_details):
21
        if error_details is None:
22
            local_logger.info(self.lcl.gettext(
23
                'Pandas Data Frame has just been saved to file "{file_name}", '
24
                + 'considering {file_type} as file type')
25
                              .replace('{file_name}', in_file_details['name'])
26
                              .replace('{file_type}', in_file_details['format']))
27
        else:
28
            local_logger.error(
29
                self.lcl.gettext(
30
                    'Error encountered on saving Pandas Data Frame '
31
                    + 'into a {file_type} file type (see below)')
32
                    .replace('{file_type}', in_file_details['format'].upper()))
33
            local_logger.error(error_details)
34
35
    def fn_load_file_list_to_data_frame(self, local_logger, timmer, file_list, csv_delimiter):
36
        timmer.start()
37
        out_data_frame = pd.concat([pd.read_csv(filepath_or_buffer=current_file,
38
                                                delimiter=csv_delimiter,
39
                                                cache_dates=True,
40
                                                index_col=None,
41
                                                memory_map=True,
42
                                                low_memory=False,
43
                                                encoding='utf-8',
44
                                                ) for current_file in file_list])
45
        local_logger.info(self.lcl.gettext(
46
            'All relevant files ({files_counted}) were merged into a Pandas Data Frame')
47
                          .replace('{files_counted}', str(len(file_list))))
48
        timmer.stop()
49
        return out_data_frame
50
51
    def fn_save_data_frame_to_csv(self, local_logger, in_data_frame, in_file_details):
52
        if in_file_details['format'].lower() == 'csv':
53
            if 'field-delimiter' not in in_file_details:
54
                in_file_details['field-delimiter'] = os.pathsep
55
            try:
56
                in_data_frame.to_csv(path_or_buf=in_file_details['name'],
57
                                     sep=in_file_details['field-delimiter'],
58
                                     header=True,
59
                                     index=False,
60
                                     encoding='utf-8')
61
                self.fn_file_save_error_logger(local_logger, in_file_details, None)
62
            except Exception as err:
63
                self.fn_file_save_error_logger(local_logger, in_file_details, err)
64
65 View Code Duplication
    def fn_save_data_frame_to_excel(self, local_logger, in_data_frame, in_file_details):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
66
        if in_file_details['format'].lower() == 'excel':
67
            if 'compression' not in in_file_details:
68
                in_file_details['compression'] = 'gzip'
69
            try:
70
                in_data_frame.to_pickle(path=in_file_details['name'],
71
                                        compression=in_file_details['compression'])
72
                self.fn_file_save_error_logger(local_logger, in_file_details, None)
73
            except Exception as err:
74
                self.fn_file_save_error_logger(local_logger, in_file_details, err)
75
76 View Code Duplication
    def fn_save_data_frame_to_pickle(self, local_logger, in_data_frame, in_file_details):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
77
        if in_file_details['format'].lower() == 'pickle':
78
            if 'compression' not in in_file_details:
79
                in_file_details['compression'] = 'gzip'
80
            try:
81
                in_data_frame.to_pickle(path=in_file_details['name'],
82
                                        compression=in_file_details['compression'])
83
                self.fn_file_save_error_logger(local_logger, in_file_details, None)
84
            except Exception as err:
85
                self.fn_file_save_error_logger(local_logger, in_file_details, err)
86
87
    def fn_store_data_frame_to_file(self, local_logger, timmer, in_data_frame, in_file_details):
88
        timmer.start()
89
        self.fn_store_data_frame_to_file_validation(local_logger, in_file_details)
90
        if 'format' in in_file_details:
91
            self.fn_save_data_frame_to_csv(local_logger, in_data_frame, in_file_details)
92
            self.fn_save_data_frame_to_excel(local_logger, in_data_frame, in_file_details)
93
            self.fn_save_data_frame_to_pickle(local_logger, in_data_frame, in_file_details)
94
        timmer.stop()
95
96
    def fn_store_data_frame_to_file_validation(self, local_logger, in_file_details):
97
        if 'format' in in_file_details:
98
            implemented_file_formats = ['csv', 'excel', 'pickle']
99
            given_format = in_file_details['format'].lower()
100
            if given_format not in implemented_file_formats:
101
                local_logger.error(self.lcl.gettext(
102
                    'File "format" attribute has a value of "{format_value}" '
103
                    + 'which is not among currently implemented values: '
104
                    + '"{implemented_file_formats}", therefore file saving is not possible')
105
                                   .replace('{format_value}', given_format)
106
                                   .replace('{implemented_file_formats}',
107
                                            '", "'.join(implemented_file_formats)))
108
        else:
109
            local_logger.error(self.lcl.gettext('File "format" attribute is mandatory '
110
                                                + 'in the file setting, but missing, '
111
                                                + 'therefore file saving is not possible'))
112