TAB_SIZE = 2 tab = 0 tabArray = 0 result = '{\n' brackets = [] array = 0 simpleArray = False def append_to_result(string): global result, tab result += f'{" " * (tabArray + tab + 2)}{string}' def compute_tab_size(yamlFile): for i in yamlFile[1:]: deltaTab = len(i) - len(i.lstrip()) if deltaTab != 0: return deltaTab return 0 with open('input.yaml', encoding='UTF-8') as inpt: inpt = inpt.readlines() TAB_SIZE = compute_tab_size(inpt) for key, i in enumerate(inpt): if i.lstrip()[0] == '#': continue if i.count(':') == 0 and i.strip()[0] == '-': append_to_result(f'{transform(i.strip()[2:])},\n') simpleArray = True continue if simpleArray: result = result[:len(result) - 2] + '\n' append_to_result(brackets.pop() + ',\n') simpleArray = False i = [i.split('#')[0].split(':')[0], ':'.join(i.split('#')[0].split(':')[1:])] # Обработка табов deltaTab = len(i[0]) - len(i[0].lstrip()) if tab != deltaTab: if tab < deltaTab: tab = deltaTab else: result = result[:len(result) - 2] + '\n' append_to_result(brackets.pop() + ',\n') if abs(deltaTab - tab)//TAB_SIZE > 1: result = result[:len(result) - 2] + '\n' append_to_result(brackets.pop() + ',\n') tab = deltaTab # Обработка массивов if i[0].strip()[0] == '-': i[0] = i[0].lstrip()[1:].strip() append_to_result('{\n') brackets.append('}') tab += TAB_SIZE # Обработка вложенных объектов if i[1].strip() == '': br = '' if inpt[key+1].split(':')[0].strip()[0] == '-': br = '[]' else: br = '{}' append_to_result(f'"{i[0].strip()}": {br[0]}\n') brackets.append(br[1]) else: def transform(s: str): try: return int(s) except: try: return float(s) except: if s.strip() in ["y", "Y", "yes", "Yes", "YES", "n", "N", "no", "No", "NO", "true", "True", "TRUE"]: return "true" elif s.strip() in ["false", "False", "FALSE", "on", "On", "ON", "off", "Off", "OFF"]: return "false" return '"' + s.replace("\\", "\\\\").replace("\"", "\\\"").strip() + '"' i = list(map(transform, i)) append_to_result(f'{i[0]}: {i[1]},\n') if brackets is not None: for _ in range(len(brackets)): tab -= TAB_SIZE result = result[:len(result) - 2] + '\n' i = brackets.pop() append_to_result(i + ',\n') result = result[:len(result) - 2] + '\n' result += '}' with open('output.json', 'w', encoding='UTF-8') as output: print(result) result = result.replace('\n', '') r = '' data = False for key, i in enumerate(result): if i != ' ' and not data: r += i if data: r += i if i == '"' and result[key - 1:key+1] != r'\"': data = not data output.write(r) print(r)