import time import yaml import re import json # --- TASK 0 --- # TAB_SIZE = 2 tab = 0 tabArray = 0 result = '{\n' brackets = [] def task0(): global TAB_SIZE, tab, tabArray, result, brackets def append_to_result(string): global result, tab result += f'{" " * (tabArray + tab + 2)}{string}' with open('input-csv.yaml', encoding='UTF-8') as inpt: inpt = inpt.readlines() for key, i in enumerate(inpt): i = i.split(':') if tab != len(i[0]) - len(i[0].lstrip()): if tab < len(i[0]) - len(i[0].lstrip()): tab = len(i[0]) - len(i[0].lstrip()) else: tab = len(i[0]) - len(i[0].lstrip()) result = result[:len(result) - 2] + '\n' append_to_result(brackets.pop() + ',\n') if i[0].strip()[0] == '-': if tab == tabArray and ']' not in brackets: append_to_result('[\n') brackets.append(']') tabArray += 2 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 shielding(s: str): return s.replace("\\", "\\\\").replace("\"", "\\\"") i = list(map(shielding, i)) append_to_result(f'"{i[0].strip()}": "{":".join(i[1:]).strip()}",\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 += '}' # --- TASK 1 --- # def task1(): with open('input-csv.yaml', encoding='UTF-8') as inpt: obj = yaml.safe_load(inpt) json.dumps(obj, ensure_ascii=False).encode('utf8') # --- TASK 2 --- # TAB_SIZE = 2 tab = 0 tabArray = 0 result = '{\n' brackets = [] def task2(): global TAB_SIZE, tab, tabArray, result, brackets def append_to_result(string): global result, tab, tabArray result += f'{" " * (tabArray + tab + 2)}{string}' with open('input-csv.yaml', encoding='UTF-8') as inpt: inpt = inpt.readlines() for key, i in enumerate(inpt): i = i.split(':') # Обработка табов deltaTab = len(re.findall(r'(? 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) t0 = time.perf_counter() for _ in range(100): task0() print('Задание 0: ', time.perf_counter() - t0) t1 = time.perf_counter() for _ in range(100): task1() print('Задание 1: ', time.perf_counter() - t1) t2 = time.perf_counter() for _ in range(100): task2() print('Задание 2: ', time.perf_counter() - t2) t3 = time.perf_counter() for _ in range(100): task2() print('Задание 3: ', time.perf_counter() - t3)