Sometimes we need to store the different settings in a text file. Getting the different configurations will be easier if each particular setting group is a dict with the different key value pairs. The dict objects can be passed to other functions or modules with ease.
I created the following script that is able to parse the strings from a text file as separate dict obj with base type. This allows user to create the dict object easily in a text file. As for now, the values the dict can take basic type such as int, float and string.
Creating the text file format is simple. Starting a dict on a new line with $ <dict name> followed by the key value pairs in each subsequent line. The format for the pair is <key>:<value1,value2…>
Example of a file format used is as below:
## Text file $first aa:bbb,cccc,1,2,3 1:1,bbb,cccc,1,2,3 $second ee:bbb,cccc,1,2,3 2:1,bbb,cccc,1,2,3 ## end of file
## python output as one dict containing two dicts with name 'first' and 'second' >> {'first': {'aa':['bbb','cccc',1,2,3],1:[1,'bbb','cccc',1,2,3]}, 'second': {'ee':['bbb','cccc',1,2,3],2:[1,'bbb','cccc',1,2,3]}}
The script is relatively simple, making use of the literal_eval method in ast module to convert the string to various base type. It does not have the danger of eval() method. Below is the code for the method for string conversion.
def convert_str_to_correct_type(self, target_str): """ Method to convert the str repr to the correct type Idea from http://stackoverflow.com/questions/2859674/converting-python-list-of-strings-to-their-type Args: target_str (str): str repr of the type Returns: (str/float/int) : return the correct representation of the type """ try: return ast.literal_eval(target_str) except ValueError: ## not converting as it is string pass return target_str
The rest of script is the reading of the different line and parsing it with correct info. The method can be summarized as below method call.
def parse_the_full_dict(self): """Method to parse the full file of dict Once detect dict name open the all the key value pairs """ self.read_all_data_fr_file() self.dict_of_dict_obj = {} ## start parsing each line ## intialise temp_dict obj start_dict_name = '' for line in self.filedata: if self.is_line_dict_name(line): start_dict_name = self.parse_dict_name(line) ## intialize the object self.dict_of_dict_obj[start_dict_name] = dict() elif self.is_line_key(line): temp_key, temp_value = self.parse_key(line) self.dict_of_dict_obj[start_dict_name][temp_key] = temp_value
The next more complicated case is to handle list of list and also user objects. I do not have any ideas on how to do it yet….
2 comments