import csv import os import re import datetime DIR_WORK = "./" LIST_BAD_ADAPTER = ['Wireless', 'Bluetooth', 'Wireless', 'WiFi', 'Kaspersky', 'VirtualBox', 'TAP-Windows', 'Wintun', '802.11', 'VMware', 'VPN', 'Wi-Fi', '1394', 'Mobile'] def check_correct_controller(name): return any(ext not in name for ext in LIST_BAD_ADAPTER) class ObjectReady: def get_len_dict(self): return len(self.__dict__) def get_paths(): list_path = [] for root, _, files in os.walk(DIR_WORK): list_path += [ F"{root}/{file}" for file in files if file.split('.')[-1] == 'csv' and "result" not in file] return list_path def convert_mb_to_gb(val): numbers = int(''.join([x for x in val if x.isdigit()])) return str(round(numbers/1024, 1))+' GB' def get_ser_motherboard(row): if len(row) > 0: if row[0][6] != 'To be filled by O.E.M.': return row[0][6] else: return None else: return None def get_data_from_file(path, obj): with open(path, 'r', encoding='utf-16') as file: cs = csv.reader(file, delimiter=',') next(cs) line_info_computers = next(cs) obj.os = line_info_computers[7] obj.motherboard = get_ser_motherboard( [x for x in cs if x[0] == '6200']) obj.cpu = line_info_computers[13] obj.ram = convert_mb_to_gb(line_info_computers[14]) network_params = [x for x in cs if len( x) > 2 and x[0] == '2600' and check_correct_controller(x[3])] if len(network_params) != 0: i = 1 for network in network_params: setattr(obj, F'ip{i}', network[6].split(' ')[0]) setattr(obj, F'mac{i}', network[-3]) i += 1 else: obj.ip1 = None obj.mac1 = None file.close() def get_ready_information(): err_file = open(F"Error_file-{datetime.datetime.today().strftime('%Y-%m-%d-%H.%M.%S')}", "w") list_objects = [] for path in get_paths(): obj = ObjectReady() obj.frame = path.split('/')[-2] obj.cabinet = re.findall( r"\/([\w+?\ ?[а-яА-Я]+\ ?|\w+?\ ?[a-zA-Z]+\ ?|\d+])[\.|\,]", path)[-1] try: get_data_from_file(path, obj) except UnicodeDecodeError as ude: err_file.write(F"{path} --> {ude}\n") except StopIteration as si: err_file.write(F"{path} --> Пустой файл или тмпо того\n") list_objects.append(obj) return list_objects def create_csv(list_obj): max_index = max([(v.get_len_dict(), i) for i, v in enumerate(list_obj)])[1] namefile = F"result-{datetime.datetime.today().strftime('%Y-%m-%d-%H.%M.%S')}" with open(F"{namefile}.csv", 'w', newline='') as f: name_fields = [v for v in list_obj[max_index].__dict__] writer = csv.DictWriter(f, fieldnames=name_fields, delimiter=';', quoting=csv.QUOTE_NONNUMERIC) writer.writeheader() [writer.writerow(elem.__dict__) for elem in list_obj] f.close() if __name__ == '__main__': ready_information = get_ready_information() create_csv(ready_information)