задач по работе, попрактиковаться.
Имеется файл('input.xlsx'), в котором входные данные представлены в виде перечня участковых лесничеств, которые состоят из кварталов, которые, в свою очередь, состоят из выделов и занимают определенную площадь. Необходимо вывести данные в виде таблицы в выходном файле ('output.xlsx'), где в первой графе участковое лесничество, во второй перечень вида кварталы(выделы), в третьей площадь по участковому лесничеству (образцы файлов прикрепляю).
Вот что у меня получилось:
''' Создание списка арендуемых кварталов и выделов по участковым лесничествам для лесного участка (в качестве исходных данных необходим файл .xlsx с 4 колонками: Участковое лесничество, Квартал, Выдел, Площадь) ''' import os.path import openpyxl as xl def read_data(): ''' Читаем данные, на выходе получаем список списков вида [[Участковое лесничество, квартал, выдел, площадь], [...]] без шапки таблицы ''' # Выбираем входной файл в формате .xlsx с данными на рабочем столе wb = xl.load_workbook((os.path.join(os.path.expanduser('~'), 'Desktop', input('Enter the file name on your desktop: \n')))) ws = wb.active # Получаем список списков вида [Участковое лесничество, # Квартал, Выдел, Площадь] data = [[val.value for val in row] for row in ws.iter_rows()] # Удаляем шапку таблицы del data[0] return sorted(data) def list_vyd_to_str(list_vyd): ''' Получение строки со списком выделов вида '1-3,5,7,10-12' ''' result_list = [] lst = [] # Проверяем список на наличие выделов-дубликатов, # преобразуем элементы списка в числа, сортируем for vyd in list_vyd: if vyd not in lst: lst.append(vyd) else: print('Выделы-дубликаты в квартале!') lst = sorted(map(int, lst)) def check_list(): """ Функция для проверки отсутствия выделов в списке выделов в квартале """ for k, v in enumerate(range(lst[0], lst[-1])): if v not in lst: return k return len(lst) while lst: t = check_list() if t > 2: result_list += '{}-{},'.format(lst[0], lst[t-1]) lst = lst[t:] else: result_list += '{},'.format(lst[0]) lst = lst[1:] result_list = result_list[:-1] return ''.join(result_list) def data_processing(data_from_file): ''' Получаем список вида ['Участковое лесничество', 'кв....(выд....)', 'Сумма выделов по участковому лесничеству'] из списка вида [['Участковое лесничество', квартал, выдел, площадь], [...]] ''' # Получаем список вида ['Участковое лесничество', 'Квартал', [],[]], # который будем использовать в качестве шаблона # для отбора выделов, соответствующих определенному лесничеству # и определенному кварталу, два пустых списка для # перечня выделов и площадей соответственно list_temp = [[line[0], line[1], [], []] for line in data_from_file] # Удаляем повторяющиеся элементы этого списка list_forestry_kv = [] for forestry_kv in list_temp: if forestry_kv not in list_forestry_kv: list_forestry_kv.append(forestry_kv) # Добавляем в список выделы и их площади, получаем # список вида [['Участковое лесничество', # 'Квартал', [1,2,3,5,...], [0.1, ...]], [...]] for template in list_forestry_kv: for line in data_from_file: if (template[0] == line[0] and template[1] == line[1]): template[2].append(line[2]) template[3].append(line[3]) # Получаем список вида [['Участковое лесничество', # 'Квартал', '1-3,5', 0.1], [...]] for line in list_forestry_kv: line[2] = list_vyd_to_str(line[2]) line[3] = round(sum(map(float, line[3])), 1) # Сливаем квартал и выделы каждого элемента # последовательности в строку вида # кв.1(выд.1,2,3) list_forestry_kv = [(str(item[0]), 'кв.' + str(item[1]) + ' (выд.' + str(item[2]) + '),', item[3]) for item in list_forestry_kv] # Составляем список участковых лесничеств в файле list_temp = [line[0] for line in data_from_file] # Удаляем повторяющиеся элементы этого списка forestry_lst = [] for forestry in list_temp: if forestry not in forestry_lst: forestry_lst.append(forestry) # Создаем шаблон для выходных данных, который представляет # собой список списков по числу участковых лесничеств result_list = [[forestry, '', 0] for forestry in forestry_lst] # Приплюсовываем в каждый из этих списков во 2 и 3 # элемент соответственно строки вида кв.1(выд.1) и # площади for forestry in forestry_lst: for kv in list_forestry_kv: for item in result_list: if (forestry in kv and forestry in item): item[1] += kv[1] item[2] += kv[2] # Удаляем запятую в конце каждого списка, # а также округляем площади по лесничеству for item in result_list: item[1] = item[1][:-1] item[2] = round(item[2], 1) return result_list def write_data(data_for_write): ''' Записываем данные в файл ''' # Добавляем шапку таблицы # в список с данными wb = xl.Workbook() ws = wb.active ws.append(['Участковое лесничество', 'Квартал (выдел)', 'Площадь, га']) total = 0 # Сумма по лесному участку # Записываем в файл построчно все списки и # и подбиваем общую сумму for i in data_for_write: ws.append(i) total += float(i[-1]) ws.append(['Итого', '', total]) wb.save((os.path.join(os.path.expanduser('~'), 'Desktop', input('Enter the name for the saved file: \n')))) if __name__ == '__main__': write_data(data_processing(read_data()))
Подскажите, пожалуйста, какие ошибки в коде, может, что-то надо было сделать как-то по-другому.
Я новичок в Python и в программировании вообще.
Входной файл
Выходной файл

