Пишу простую, но реальную программу. Python + Excel.
HTML-код
- Опубликовано: 27 май 2024
- Python-разработчик от Хекслет - lnnk.in/jddo
Реальный пример из жизни, как я работал с Excel - файлом при помощи языка программирования Python.
Задача - обработать XLSX-файл Бланка заказа и составить новую таблицу соответствия подкатегорий товара и принадлежащих им артикулов.
Подробно объясняю процесс создания программы.
В процессе использую библиотеку openpyxl, операции со строками, типы данных dictionary, list, операции со строками, сортировку словаря по ключам и многое другое.
⭐️ Мой подробный "Роадмап деда-программиста. Python бэкенд." со скидкой 10% : stepik.org/a/133721/pay?promo...
Чат Дедов-программистов в телеграме: t.me/oldcodersclub
Наш очень крутой GitHub дедов-программистов с кучей полезной информации для начинающих - роадмапы, с чего начать и куда развиваться : github.com/OldCodersClub
Финальный код и excel файл: github.com/break-and-enter/ol...
00:00 Intro
00:15 Задача
01:50 Библиотека openpyxl
03:23 Архитектура программы
03:53 Цикл for
04:14 Смотрим декларацию методов в PyCharm
05:25 Метод cell из openpyxl
06:13 Полезная реклама
08:00 Продолжаем
09:29 Словарь
11:54 Список как значение словаря
13:09 Красивый вывод: pprint
13:53 Запись в файл
14:54 Операции со строками
16:47 Сортировка словаря по ключам
17:55 Финальный код - Наука
Это вообще законно, объяснять так понятно и наглядно? )) Спасибо!
😆😆😆
Вы бы skillbox посмотрели как там наглядно про основы взлома показывали)).
@@Akkaunt__Yerjan есть на ютубе?) Подскажите, если да
@@Akkaunt__Yerjan помню вначале нулевых изучал фак по фриинету, будучи студентом безденежным, да ещё и музыкантом, вот у меня к пела голова😂 Научился инет добывать, да ещё и не обворовывая людей при этом :)) Данные для авторизации тырил конечно, проникая в компы через гостевой доступ для авторизации. И оказалось, что у прова мультилогины были у всех😅 РОЛ вроде это был😂
Спасибо автору! Описан нормальный путь создания скрипта от постановки задачи до практической реализации в конкретной области. Использование простых конструкций позволяет понять происходящее для начального уровня, кому и предназначены эти видео.
Замечания в комментариях по улучшению предложенного кода расширяют кругозор. Их авторам также спасибо!
В очередной раз убеждаюсь, что реальные задачи намного интереснее и эффективнее. Нужно как-нибудь попробовать. Спасибо большое за видео!
Нет необходимость так сортировать словарь (преобразования сортированного списка кортежей обратно в словарь) достаточно написать for key, value in sorted(subcategories_dict.items()): т.к. по сути словари это неупорядоченные последовательности. То что в последних версиях python перебор элементов словаря идёт по порядку их занесения в словарь, не гарантирует аналогичное поведение в более ранних версиях python
О, круто, спасибо!!
Меня сортировка словаря тоже слегка насторожила. Погуглил - оказывается начиная с версии Питон 3.6 словарь сохраняет порядок элементов в порядке их добавления. В более ранних версиях такого нет.
@@eugenedukatta9355 с версии 3.9
Удачи в Новом году!
Буду с нетерпением ждать новые видосы🤗
У Excel для решения подобной задачи без программирования есть собственный мощный инструмент - сводная таблица. Но пример полезный, спасибо.
👌 но у нас цель - программирование
Спасибо за клевую практику и прикладное применение всех этих циклов, словарей и джоинов!!!!
Спасибо! Хороший пример. Решал недавно задачу с курса по работе с файлами, тут практически то же самое)
Спасибо большое за ролик. Интересно слушать взрослых программистов.
Объяснение, подача, реальные задачи, вы просто популяризатор программирования!
Материал изложен в доступной для понимания форме. Спасибо.
Видео еще не смотрела, думаю, там все как всегда очень хорошо, но елочка на батарее очень милая, спасибо за настроение ☺️🧡
☺️🎄
Очень полезно и в отличном темпе для начинающе-продолжающих! Спасибо! Подписка однозначно
Дед, ты лучший!
Создаешь топовый контент!
Спасибо!
Спасибо большое, мне как новичку и самоучке, тяжело найти наглядный пример. А тут прям то что нужно! Понимаю что возможно не оптимальное решение, но сам процесс поиска ответов, очень помог мне. Ещё раз спасибо, для меня очень полезная информация! Судя по коментариям и я дед)
вы такой молодец.поддерживаете своими роликами.Спасибо!
Хорошее видео с ходом рассуждения и реальный код👍
Было бы замечательно и профессионально, после выхода комментариев, создать следующее видео, автор решит ту же задачу, но учтёт полезные комментарии, и немного усложнить задачу. К примеру что-то запишет в один файл с таким именем, а что-то в другой файл с другим расширением в другом виде. Методов много, хочется примеры на все методы. Т.е. к примеру, четыре видео, и в них раскрыты все методы работы со строками на простой реальной программе! Это лучший канал для самообучения! В остальных видео много просто примеров, а здесь реальные программы! Спасибо за видео! Успехов каналу и ведущему! Жду новые видео по всем разделам Python, что бы можно было освоить их и вырасти от джуна до мидла!
Спасибо! Я тоже думаю о том, чтобы изменить программы с учётом советов, данных в комментариях, и записать видео об этом .
@@oldcoders 🤝🤝🤝
Можно усовершенствовать программу, если добавить файл базы данных MySQL и в него писать необходимые значения и сохранять, переносить таким образом вместо файла ini. Ну и потом написать графический интерфейс, можно на Kivy для мультиплатформенности.
Дело в том что мне такой вариант совершенно не нужен. Ни графический интерфейс ни БД. У меня этот скрипт встроится в мое большое веб-приложение. И я там использую ini файлы чтобы не хардкодить, не записывать в код то, что может меняться в зависимости от разных ситуаций. Чтобы с приходом нового сезона например не переписывать основной код приложения. Просто обновил ini файл, изменил если надо руками, добавил что надо - и готово. Приложение работает с новым сезоном . Без залезания в код.
@@oldcoders а почему ini файлы, а не тот же json?
Спасибо! Отличный информативный контент. Удачи в Новом году и новых идей в развитии канала🎉
Я также ловлю кайф от работы с python. Был тоже опыт работы с Excel: однажды получилась очень удачный и стройный скрипт - на штатный разработчик Excel/VB начал у меня выяснять где же основной модуль реализации и не поверил, что этот скрипт и был всей рабочей программой
Очень полезное видео !!!Как раз подобную программу реализую как начинающий программист, свой проект)Спасибо вам за труды. Подписка однозначно и рекомендации друзьям и знакомым!
привет. Здорово, что показываешь реальные задачи с реальными алгоритмами) Продолжай в том же духе). По коду хотелось бы добавить, что можно избавиться от конструкции if-else стандартным методом dict.setdefault(key, list()).append(value) - т.е. если значение ключа есть, то он будет добавлен в список, а если такого ключа нету, тогда будет создан такой ключ в словаре и в него уже добавлен value. Надеюсь понятно написал))
О, круто! Спасибо большое!!
@@oldcoders ещё удобно использовать defaultdict() стандартного модуля collections. Особенно если нужно получить вложенность в словаре наподобие json.
Можно просто subcategories_dict = defaultdict(list)
Таким образом можно указать, что в словаре в качестве значений будут листы. И можно смело делать subcategories_dict['любой ключ'].append(sku)
Класс!
Огромное спасибо!
На работе часто используют Excel, и Python может очень помочь.
Было бы ещё круче в конце видео записать данные в новый xlsx файл через цикл.
У меня ест многолетний опыт анализа данных в Excel. И эту задачу в Excel можно выполнить примерно за полторы минуты. Может 3 минуты. Загружаем всю таблицу в модель данных (Power Pivot). Создаём одну меру на DAX CONCATENATE. После чего выводу ее в сводную таблицу. Все. Выглядит гораздо быстрее чем способ на видео.
А касаемо программирования... Я только в прошлом месяце начал учить Python для анализа данных. Знаю совсем немного. Но я бы в данном случае использовал бы Pandas. Подключился к таблице с переводом ее в DataFrame. Оставил бы только две нужные колонки. После чего загуглил (или чатгпт) как в Пандасе делать конкатинацию, так как такого ещё не учил. Мне кажется это будет проще и быстрее чем выщитывать номера колонок. А вдруг в следующей выгрузке добавиться колонка с новой информацией? Тогда номер колонки измениться и весь алгоритм пойдет лесом. А если привязаться к названию, то куда бы колонка не переехала, то ничего не поломается. Хотя может вмешаться человеческий фактор и измениться название колонки в таблице, но предусмотреть все невозможно.
А какая библиотека для вывода в эксель из питона?
Очень хорошее и информативное видео. Спасибо - шикарная работа !!!!!
Маркировать пункты списка бокалами пива - это отличная идея.
Шалю немного :)
Мне вообще видео в тему!
Как раз думал исполнить что то подобное с данными ЕХ таблицы.
Спасибо!
Спасибо! Не пробовал работать с pprint и было интересно про чтение данных из ексель, применю в работе и автоматизирую процессы
Супер! Если еще будут примеры работы питона с экселем, по возможности, пжт, выкладывайте. Очень интересно) Спасибо!
👌 Есть еще одно видео на канале у меня, посмотрите, pandas + excel
Привет! Спасибо за видео! По поводу наполнения словаря подкину еще один вариант. Можно воспользоваться методом get(), что бы избежать конструкции if-else:
subcategories_dict[subcategory] = subcategories_dict.get(subcategory, [ ]) + [sku]
т.е. перед тем как записать значение ключа мы проверяем что у нас там уже есть по этому ключу через get(), если ничего нет то применяется второй аргумент у get() что положить туда, если ничего не нашлось. В случае, если найдется, то мы к списку просто прибавим еще одно значение.
Спасибо!! Возьму на заметку!
Для этого есть defaultdict чтобы такие кастыли не писать
Спасибо за ответ. Когда я писал код попримеру в else выдавало ошибку, sku было стрингом, что не позволяло добавлять в него через аппенд. Твоё решение все исправило!
Словарь по итогу отсортирован по ключу, как строке (1.10, 1.11 идут впереди 1.2), а нужно как по числу. В программе не хватает вот этого последнего штришка. :)
Просто мне не нужно было это. Это задача не учебная а реальная. Такой сортировки более чем достаточно, времени тратить на ненужную «досортировку» - смысла нет. И видео усложнять - тем более.
Тоже делал подобную штуку для работы. Я это назвал прокинутым ВПР. Моя первая полезная программа))😊
Очень круто и полезно!
з.ы.: Все еще жду 3ю часть по Джанго 🙃 С Новым Годом!
Будет, будет.. собираюсь с силами .. 😀
@@oldcoders Дай Вам всевышний сил немеренно для благого дела! А мы очень ждем!!!
Спасибо. Очень понятные и наглядные комментарии.
хороший формат, все понятно, спасибо & так держать!
Очень познавательно! Не программирую, но с удовольствием посмотрел и вник в код.
Отлично сказано!!! Раз освоил свой язык программирования, так и используй его!
Ну очень круто)
Доходчиво и увлекательно)
Круто! Спасибо! С большим удовольствием посмотрел!
Давно шукав схоже відео для роботи з хl, шикарне пояснення )))
Ну здорово. И Питон и Эксель изучаю на Степик. Сейчас посмотрю Хекслет.
Спасибо! Продолжайте дальше)
Спасибо, очень интересно. Возможно ли сделать подобный видео-разбор с данными, которые бы писались в БД (желательно постгрес). Если бы еще на арендованном серваке было бы вдвойне полезно.
Я с БД только в Джанго работал, больше никак. В ролике про «Джанго часть 2» про это рассказывал. Но там не SQL, там ORM.
1. if else обычно стараются сократить. Я бы сделал "в случае если в словаре нет ключа" - создад запись с ключем где значение будет пустой массив. А потом аппендить туда значения без елсе. Мне так комфортнее) Не знаю кому как. Ну и еще одно замечание.
А самое главное замечание кеоторое мне бросилось в глаза - сортировка не верная. Потому что саб категория должна сортироваться 1.1, 1.2, 1.3, ...., 1.10 а не 1.1, 1.10, 1.2.
Для этого когда складываем в словарь можно сразу сделать category_dic и subcategory_dic и во втором писать только второе число подкатегории. И сортировать его как число а не как строку. В целом такая структура будет удобнее для дальнейшего использования.
Офигенно, я сам финансист и начал изучать программирование. Не думал что python можно использовать в excel
в 8:42 - чтобы посчитать кол-во столбцов - достаточно их выделить и посмотреть на "подсказку" которая будет появляться правее курсора. Подсказка вида: 1048576R x 12C
И снова отличное видео! Спасибо
Я люблю программирование. Но дальше теории никак не двинусь и по этому получаю удовольствие от просмотра таких роликов
Поставьте себе задачу, очень простую. И решите ее.
Если совсем нет задач - решайте их на codewars.
Какой смысл знать теорию и не использовать ее?
Берешь задачу - сортировка и подготовка данных из таблицы в 10000 строк, чтобы провести расчет и вывести результаты в word. Сначала пробуете на VBA, понимаете, что это полный изврат и переписываете на linq C#.... Profit.
Попробуй заняться микроконтроллерами. Esp32 + micropython. Дёшево и сердито, вдруг в тебе спит гений
Теория нужна что бы практика лучше давалась. Но основное все же практика а не теория на старте карьеры особенно
Спасибо за видео! Очень интересно
Очень информативно и интересно!
Спасибо за видео! Было позновательно)
Я бы словарь сортировал иначе, через генератор, как кто-то предложил
If/else при записи можно заменить конструкцией dict[key] = dict.get(key, []) + [value]
Если нет значения по ключу, он в него записывает пустой список и конкатенирует со списком значения
Либо dict.setdefault(key, []).append(value)
И при создании результирующей строки использовал f-string
Получилось бы что-то типа
String_write = f”{key} = {‘, ‘.join(value)}
” - здесь сразу список значений распаковывается в строку с разделителями) вообще познав однажды f-строки невозможно их разлюбить
спасибо дед за интересные ролики
Спасибо за труд!
Класс 🙌 просто и лаконично!
Спасибо большое. Очень интересно
Используйте f-строки, а не конкатенацию в чистом виде,f-строки прекрасны! Спасибо за ролик!
ура, новый видос вышел!
Можно вместо списка для артикулов использовать множество, тогда в строке артикулов не будет повторений
dict.setdefault(key, set()).add(value)
А при выводе использовать f-строку вместо строки с "+" и вставить sorted() в join, потому что множество выдает свои элементы в случайном порядке
string_values = ', '.join(sorted(value))
string_to_write = f'{key} = {string_values}
'
👍👍 спасибо
А если через метод get?
@@S_putnik Через метод get мне нравится больше
к тому же множества работают быстрее списков)
@@IvanIvanov-rp6ogкак помню, если ключа нет то выводит ошибку
Вот бы видео на этом канале появлялись чаще!
На этой неделе выйдет новое. Из этой же серии «пишу реальную программу»
Это конечно круто и мне было интересно посмотреть, но такую вещь очень легко сделать в сводной таблице excela)))) я думаю у меня было ушло на это максимум 15 минут))
Пс. Спасибо за информацию, было очень интересно
У вас преподавательский талант
Спасибо, твои видео мотивируют
Спасибо за информацию!
Очень подробно , спасибо
Я бы так решил. Прикинул пару путей. в т.ч. и через возможности самого эксель. Посмотрел бы пару гайдов. Захотел эту задачку сделать сам. Прикинул сколько времени уйдет. Почесал репу. Написал бы тезисно ТЗ. Закинул 2-3м программистам на аутсорсе. Или даже одному кто онлайн. Взял бы оценку времени. Согласовал стоимость. Запустил бы в работу. опустим моменты некоторые.. тестанул бы сам и отдал пользователю. Получив ответ что все работает как надо, закрыл бы тиккет. ВОт, такой вот я программист))))
с удовольствием посмотрел видео и почитал комментарии
Дед, спасибо. Всё как по учебнику - если код нельзя прочитать как предложение, этот код нужно переосмыслить.
Ждем 3 часть про Python Django
Библиотека Pandas имеет хороший функционал по таблицам, выборкам, группировкам, вводу/выводу файлов и т.д. Спасибо за видео!
Да, я ее использую. В этом видео нет.
Тоже про Pandas подумал. Но в исходном excel файле (в названии столбцов таблицы) заметил объединённые ячейки. У меня Pandas такое читать отказывается.
Есть вообще способ открыть excel файл с объединёнными ячейками через Pandas?
Всё чётко ясно обьяснили спс огромное
Я бы воспользовался defaultdict из модуля collections тем самым объявив бы values словаря с типом list
Спасибо! отличное видео.
Очень круто!
всё отлично, объяснение и пример, но:
1) это скрипт, а не программа, т.к. используется императивный подход, впрочем, это уже вопрос семантики.
2) задача не выполнена, т.к. условие "и формирование нового .xlsx файла" в рамках видео не выполнено
PyCharm (Win) - ctrl+b (и тоже для выхода обратно)
для pop-up подсказки - достаточно ctrl+q (второе нажатие открывает сбоку вкладку Документации) - прыгать в исходник бывает излишне; а данная комбинация также подсказывает ваши функции и классы (и даже вашу документацию, если она присутствует и создана по правилам)
Всё хорошо, но маленький недочёт.. Сортировка отработала не совсем должным образом.. 1.1, 1.10.., 1.2.. Мне кажется должно было.. 1.1, 1.2, 1.10... и тд. :) Видео очень понравилось, особенно рубрика реальных задач. Большое спасибо за видео!
И вам спасибо! Дело в том что это реальная программа и я делал ее так, как нужно мне. Мне такой «неидеальной» сортировки достаточно.
Если бы мне по какой то причине нужна была строгая сортировка - конечно я бы ее сделал.
@@oldcoders понял, в целом я конечно так и подумал) Я в таких ситуациях использую сортировку natsort :)
Понял. А я не люблю лишние модули импортировать. Если чтото можно сделать на ядре Питона, без потери в быстродействии и времени разработки - делаю на ядре.
@@oldcoders это не доблесть! ядро питона специально очень ограниченное по сравнению с другими языками, именно для мотивации исполшьзовать сторонние быблиотэки )
Привет! Спасибо за видео! Классная идея с обучением на реальной задаче. Немного душных комментов по самому видосу - слишком много внимания берут на себя перебивки с музыкой, я бы музыку или подрезал или вообще убрал. Если добавить в начале что-то типа оглавления - так будет смотреть еще интереснее. Можно еще рассказать сколько времени заняла работа и сколько за это могут заплатить) спасибо за видос! Афтор пеши исчо
Есть же оглавление - разделы под видео. За такую программу никто платить не будет, это минимальный базовый уровень владения языком. Времени заняло минут 30. За советы спасибо!
Бесконечно можно смотреть на три вещи: как огонь горит, вода течёт и профессионал работает. Так что посмотрю ка ещё раз. Это было красиво, я кайфонул. А вот использование огрызка удивило :)
Ой я не профессионал точно, я не работаю программистом. Я любитель 😀
Мак - потрясающий комп, я ему не нарадуюсь уже много лет. И для программирования очень хорошо подходит.
Всё программисты которых знаю я работают в основном а Linux. Сам хотел обзавестись Qubes OS, ну или Tails на ноуте использовать:)
Для повседневной жизни линукс менее удобен чем мак. Линукс хорош для сервера, куда свои приложения выкладывать будете. И макОС она тоже unix подобная система, считайте тот же линукс.
чувак, спасибо! очень клёво!
Спасибо интересно.
Один вопрос если у нас в исходном файле будет за двоенная строка (Артикул + Подгруппа товара), то и в финале два одинаковых артикула в подгруппе товара выйдет?
Если да, то как дописать проверку, и может добавить вывод дублей в отдельный файл для правки исходника. А то ошибка в одной цифре артикула и песчаная толстовка идет как черная.
Добавление в список по ключу хорошо делать через dict.setdefault('key', []).append('item')
классный канал! респект тебе)
Шикарно!
Спасибо за интересное видео.
Но если говорить о том какой тип данных идеален для решения данной задачи - то это конечно же классическая задача для defaultdict - словаря со значением по умолчанию)..
Да, многие написали про этот метод, спасибо!!
Познавательно и круто! Спасибо за видео и разъяснения. Однако, я хотел бы уточнить пару моментов. 1-й - кроме макросов в Excel есть прекрасный ETL в виде PowerQuery, где тоже самое можно сделать при помощи интерфейса и нескольких кликов мышки. 2-ой - на 17:50 видно, что сортировка не идеальна, т.к. после. п.3.1. (20 строчка в IDE) идёт п.3.10. (21 строчка в IDE), а ещё ниже п.3.2. (26 стока в IDE). Подскажите, пожалуйста, как это скорректировать? Спасибо!
Да, можете почитать в комментариях, об этом уже рассуждали. Чуть более сложную сортировку пришлось бы делать. Например отделять номер от названия подкатегории, переводить его в тип float , сортировать его и т.д.
Мне это было не нужно, такой первичной сортировки было достаточно.
Жаль нельзя поставить сразу два, а лучше три лайка ) пробовал с ноги сесть за написание скриптов для экселя 3 месяца назад на работке, потратил прилично времени и ничего не понял, все не работало и я забросил... сейчас после бесплатных курсов на степике (парни там реально наваливают знаний, если нужна ссыль маякните) все предельно понятно в этом видео, надо потихонечку разбираться со сторонними библиотечками.
Большое спасибо за ролик, подскажите пожалуйста что за ide используется?
PyCharm Community
питон это кнчн хорошо, но главное имхо - делать быстро и результативно. И эта таска элементарно решается за 3-5 минут сугубо экселем :)
Еще вариант - поручить кому то сделать эту задачу. Еще эффективнее.
Кстати о исходниках и "если хочется, то можно здесь всё сломать". Надо бы рассказать людям про virtual environment'ы. Меньше "но на моём компе работает" будем слышать)
тоже раньше так ипался пока не узнал про pandas)
Переменную string_towrite я бы записал через форматирование: f"{key}={string_values}
"
Деды вперед!
Воистину вперед!
Сижу и думаю, человек вы или нет? Вы выучили в 44 и сидите на светлой теме, уважение😮😅
😁 никогда не любил темные темы
Не с 7 строки, а со строки содержащую "Артикул" + 1. С такой остановкой не важно будет как создан файл exl. Да и со столбцом тоже надо описывать поиск. Это не сложно и позволит избежать ошибки в файле с номерами строк и столбцов.
Да, можно было. Просто у меня это была одноразовая задача, в приоритете - быстрота написания кода. В последующем я ее включу в большой свой проект - там да, именно так и буду делать - парсить заголовок по названию столбца.
@@oldcoders Я программирую, но не на Phyton, однако, заметил, что стоит сразу писать очевидные вещи, что-бы потом не забыть или не попасться на мелочи. И моя пометка больше к начинающим программировать. За урок, конечно, спасибо.
Спасибо Большое
Спасибо! Подписка.
В данном случае просто и необходимо использовать pandas. Считал таблицу в датафрейм, построил сводную в том же pandas и записал в новый датафрейм. Всё.
Да, я так тоже делаю. Одно из следующих видео будет про пандас.
Спасибо за видео, очень нравится этот формат!
Не совсем понял момент с sku: вы ж не объявляли эту переменную как list, как это работает?
А sku это и не лист никакой. Лист это значение словаря, в котором элементами являются sku.
subcategories_dict[subcategory]=[sku]
Вот здесь список и объявляется.
@@oldcoders Понял, спасибо большое за ответ!
Спасибо! 👍
Здравствуйте! Будут ли ещё выпуски с задачами Codewars?
Будут! Идей много, но я редко выпускаю видео, поэтому все затягивается