Пишу простую, но реальную программу. Python + Excel.
Ғылым және технология
Python-разработчик от Хекслет - lnnk.in/jddo
Реальный пример из жизни, как я работал с Excel - файлом при помощи языка программирования Python.
Задача - обработать XLSX-файл Бланка заказа и составить новую таблицу соответствия подкатегорий товара и принадлежащих им артикулов.
Подробно объясняю процесс создания программы.
В процессе использую библиотеку openpyxl, операции со строками, типы данных dictionary, list, операции со строками, сортировку словаря по ключам и многое другое.
⭐️ Мой подробный "Роадмап деда-программиста. Python бэкенд." со скидкой 20% : stepik.org/a/133721/pay?promo...
(Срок действия ссылки - до 15.05.24)
Чат Дедов-программистов в телеграме: 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 Финальный код
Пікірлер: 511
В очередной раз убеждаюсь, что реальные задачи намного интереснее и эффективнее. Нужно как-нибудь попробовать. Спасибо большое за видео!
Спасибо автору! Описан нормальный путь создания скрипта от постановки задачи до практической реализации в конкретной области. Использование простых конструкций позволяет понять происходящее для начального уровня, кому и предназначены эти видео. Замечания в комментариях по улучшению предложенного кода расширяют кругозор. Их авторам также спасибо!
Это вообще законно, объяснять так понятно и наглядно? )) Спасибо!
@oldcoders
Жыл бұрын
😆😆😆
@Akkaunt__Yerjan
Жыл бұрын
Вы бы skillbox посмотрели как там наглядно про основы взлома показывали)).
@sergey_ra
Жыл бұрын
@@Akkaunt__Yerjan есть на ютубе?) Подскажите, если да
@sergey_ra
Жыл бұрын
@@Akkaunt__Yerjan помню вначале нулевых изучал фак по фриинету, будучи студентом безденежным, да ещё и музыкантом, вот у меня к пела голова😂 Научился инет добывать, да ещё и не обворовывая людей при этом :)) Данные для авторизации тырил конечно, проникая в компы через гостевой доступ для авторизации. И оказалось, что у прова мультилогины были у всех😅 РОЛ вроде это был😂
У меня ест многолетний опыт анализа данных в Excel. И эту задачу в Excel можно выполнить примерно за полторы минуты. Может 3 минуты. Загружаем всю таблицу в модель данных (Power Pivot). Создаём одну меру на DAX CONCATENATE. После чего выводу ее в сводную таблицу. Все. Выглядит гораздо быстрее чем способ на видео. А касаемо программирования... Я только в прошлом месяце начал учить Python для анализа данных. Знаю совсем немного. Но я бы в данном случае использовал бы Pandas. Подключился к таблице с переводом ее в DataFrame. Оставил бы только две нужные колонки. После чего загуглил (или чатгпт) как в Пандасе делать конкатинацию, так как такого ещё не учил. Мне кажется это будет проще и быстрее чем выщитывать номера колонок. А вдруг в следующей выгрузке добавиться колонка с новой информацией? Тогда номер колонки измениться и весь алгоритм пойдет лесом. А если привязаться к названию, то куда бы колонка не переехала, то ничего не поломается. Хотя может вмешаться человеческий фактор и измениться название колонки в таблице, но предусмотреть все невозможно.
Удачи в Новом году! Буду с нетерпением ждать новые видосы🤗
Спасибо за клевую практику и прикладное применение всех этих циклов, словарей и джоинов!!!!
Объяснение, подача, реальные задачи, вы просто популяризатор программирования!
Спасибо большое, мне как новичку и самоучке, тяжело найти наглядный пример. А тут прям то что нужно! Понимаю что возможно не оптимальное решение, но сам процесс поиска ответов, очень помог мне. Ещё раз спасибо, для меня очень полезная информация! Судя по коментариям и я дед)
Спасибо! Хороший пример. Решал недавно задачу с курса по работе с файлами, тут практически то же самое)
Очень полезно и в отличном темпе для начинающе-продолжающих! Спасибо! Подписка однозначно
Спасибо большое за ролик. Интересно слушать взрослых программистов.
Материал изложен в доступной для понимания форме. Спасибо.
Нет необходимость так сортировать словарь (преобразования сортированного списка кортежей обратно в словарь) достаточно написать for key, value in sorted(subcategories_dict.items()): т.к. по сути словари это неупорядоченные последовательности. То что в последних версиях python перебор элементов словаря идёт по порядку их занесения в словарь, не гарантирует аналогичное поведение в более ранних версиях python
@oldcoders
Жыл бұрын
О, круто, спасибо!!
@eugenedukatta9355
Жыл бұрын
Меня сортировка словаря тоже слегка насторожила. Погуглил - оказывается начиная с версии Питон 3.6 словарь сохраняет порядок элементов в порядке их добавления. В более ранних версиях такого нет.
@TurboDeaz
18 сағат бұрын
@@eugenedukatta9355 с версии 3.9
Дед, ты лучший! Создаешь топовый контент! Спасибо!
Видео еще не смотрела, думаю, там все как всегда очень хорошо, но елочка на батарее очень милая, спасибо за настроение ☺️🧡
@oldcoders
Жыл бұрын
☺️🎄
Хорошее видео с ходом рассуждения и реальный код👍
Очень хорошее и информативное видео. Спасибо - шикарная работа !!!!!
Спасибо! Отличный информативный контент. Удачи в Новом году и новых идей в развитии канала🎉
вы такой молодец.поддерживаете своими роликами.Спасибо!
Мне вообще видео в тему! Как раз думал исполнить что то подобное с данными ЕХ таблицы. Спасибо!
Очень полезное видео !!!Как раз подобную программу реализую как начинающий программист, свой проект)Спасибо вам за труды. Подписка однозначно и рекомендации друзьям и знакомым!
Ну очень круто) Доходчиво и увлекательно)
хороший формат, все понятно, спасибо & так держать!
У Excel для решения подобной задачи без программирования есть собственный мощный инструмент - сводная таблица. Но пример полезный, спасибо.
@oldcoders
Жыл бұрын
👌 но у нас цель - программирование
Очень круто и полезно! з.ы.: Все еще жду 3ю часть по Джанго 🙃 С Новым Годом!
@oldcoders
Жыл бұрын
Будет, будет.. собираюсь с силами .. 😀
@user-fr2cy6ng6z
Жыл бұрын
@@oldcoders Дай Вам всевышний сил немеренно для благого дела! А мы очень ждем!!!
Спасибо! Продолжайте дальше)
Спасибо! Не пробовал работать с pprint и было интересно про чтение данных из ексель, применю в работе и автоматизирую процессы
Огромное спасибо! На работе часто используют Excel, и Python может очень помочь. Было бы ещё круче в конце видео записать данные в новый xlsx файл через цикл.
Было бы замечательно и профессионально, после выхода комментариев, создать следующее видео, автор решит ту же задачу, но учтёт полезные комментарии, и немного усложнить задачу. К примеру что-то запишет в один файл с таким именем, а что-то в другой файл с другим расширением в другом виде. Методов много, хочется примеры на все методы. Т.е. к примеру, четыре видео, и в них раскрыты все методы работы со строками на простой реальной программе! Это лучший канал для самообучения! В остальных видео много просто примеров, а здесь реальные программы! Спасибо за видео! Успехов каналу и ведущему! Жду новые видео по всем разделам Python, что бы можно было освоить их и вырасти от джуна до мидла!
@oldcoders
Жыл бұрын
Спасибо! Я тоже думаю о том, чтобы изменить программы с учётом советов, данных в комментариях, и записать видео об этом .
@kostashvetsov9258
Жыл бұрын
@@oldcoders 🤝🤝🤝
@MrSuperfantom
Жыл бұрын
Можно усовершенствовать программу, если добавить файл базы данных MySQL и в него писать необходимые значения и сохранять, переносить таким образом вместо файла ini. Ну и потом написать графический интерфейс, можно на Kivy для мультиплатформенности.
@oldcoders
Жыл бұрын
Дело в том что мне такой вариант совершенно не нужен. Ни графический интерфейс ни БД. У меня этот скрипт встроится в мое большое веб-приложение. И я там использую ini файлы чтобы не хардкодить, не записывать в код то, что может меняться в зависимости от разных ситуаций. Чтобы с приходом нового сезона например не переписывать основной код приложения. Просто обновил ini файл, изменил если надо руками, добавил что надо - и готово. Приложение работает с новым сезоном . Без залезания в код.
@abracadabra5491
8 ай бұрын
@@oldcoders а почему ini файлы, а не тот же json?
Супер! Если еще будут примеры работы питона с экселем, по возможности, пжт, выкладывайте. Очень интересно) Спасибо!
@oldcoders
11 ай бұрын
👌 Есть еще одно видео на канале у меня, посмотрите, pandas + excel
Круто! Спасибо! С большим удовольствием посмотрел!
привет. Здорово, что показываешь реальные задачи с реальными алгоритмами) Продолжай в том же духе). По коду хотелось бы добавить, что можно избавиться от конструкции if-else стандартным методом dict.setdefault(key, list()).append(value) - т.е. если значение ключа есть, то он будет добавлен в список, а если такого ключа нету, тогда будет создан такой ключ в словаре и в него уже добавлен value. Надеюсь понятно написал))
@oldcoders
Жыл бұрын
О, круто! Спасибо большое!!
@a.d.8390
Жыл бұрын
@@oldcoders ещё удобно использовать defaultdict() стандартного модуля collections. Особенно если нужно получить вложенность в словаре наподобие json.
@Gr3gnov
Жыл бұрын
Можно просто subcategories_dict = defaultdict(list) Таким образом можно указать, что в словаре в качестве значений будут листы. И можно смело делать subcategories_dict['любой ключ'].append(sku)
@oldcoders
Жыл бұрын
Класс!
Спасибо. Очень понятные и наглядные комментарии.
Давно шукав схоже відео для роботи з хl, шикарне пояснення )))
И снова отличное видео! Спасибо
Тоже делал подобную штуку для работы. Я это назвал прокинутым ВПР. Моя первая полезная программа))😊
Спасибо за видео! Очень интересно
Спасибо! 👍
Я также ловлю кайф от работы с python. Был тоже опыт работы с Excel: однажды получилась очень удачный и стройный скрипт - на штатный разработчик Excel/VB начал у меня выяснять где же основной модуль реализации и не поверил, что этот скрипт и был всей рабочей программой
Спасибо, очень интересно. Возможно ли сделать подобный видео-разбор с данными, которые бы писались в БД (желательно постгрес). Если бы еще на арендованном серваке было бы вдвойне полезно.
@oldcoders
Жыл бұрын
Я с БД только в Джанго работал, больше никак. В ролике про «Джанго часть 2» про это рассказывал. Но там не SQL, там ORM.
ура, новый видос вышел!
Спасибо за труд!
Очень познавательно! Не программирую, но с удовольствием посмотрел и вник в код.
Спасибо за видео! Было позновательно)
Очень информативно и интересно!
Привет! Спасибо за видео! По поводу наполнения словаря подкину еще один вариант. Можно воспользоваться методом get(), что бы избежать конструкции if-else: subcategories_dict[subcategory] = subcategories_dict.get(subcategory, [ ]) + [sku] т.е. перед тем как записать значение ключа мы проверяем что у нас там уже есть по этому ключу через get(), если ничего нет то применяется второй аргумент у get() что положить туда, если ничего не нашлось. В случае, если найдется, то мы к списку просто прибавим еще одно значение.
@oldcoders
Жыл бұрын
Спасибо!! Возьму на заметку!
@yawneed
Жыл бұрын
Для этого есть defaultdict чтобы такие кастыли не писать
@user-pk7ik7ho9q
Жыл бұрын
Спасибо за ответ. Когда я писал код попримеру в else выдавало ошибку, sku было стрингом, что не позволяло добавлять в него через аппенд. Твоё решение все исправило!
Спасибо за информацию!
Спасибо, твои видео мотивируют
спасибо дед за интересные ролики
Спасибо большое. Очень интересно
Очень круто!
Класс 🙌 просто и лаконично!
Очень подробно , спасибо
Всё чётко ясно обьяснили спс огромное
Маркировать пункты списка бокалами пива - это отличная идея.
@oldcoders
Сағат бұрын
Шалю немного :)
Я люблю программирование. Но дальше теории никак не двинусь и по этому получаю удовольствие от просмотра таких роликов
@oldcoders
Жыл бұрын
Поставьте себе задачу, очень простую. И решите ее. Если совсем нет задач - решайте их на codewars. Какой смысл знать теорию и не использовать ее?
@Gimli_Dwarf
Жыл бұрын
Берешь задачу - сортировка и подготовка данных из таблицы в 10000 строк, чтобы провести расчет и вывести результаты в word. Сначала пробуете на VBA, понимаете, что это полный изврат и переписываете на linq C#.... Profit.
@edrdr
Жыл бұрын
Попробуй заняться микроконтроллерами. Esp32 + micropython. Дёшево и сердито, вдруг в тебе спит гений
@no101vmv
Жыл бұрын
Теория нужна что бы практика лучше давалась. Но основное все же практика а не теория на старте карьеры особенно
Шикарно!
Офигенно, я сам финансист и начал изучать программирование. Не думал что python можно использовать в excel
Ну здорово. И Питон и Эксель изучаю на Степик. Сейчас посмотрю Хекслет.
чувак, спасибо! очень клёво!
Отлично сказано!!! Раз освоил свой язык программирования, так и используй его!
классный канал! респект тебе)
с удовольствием посмотрел видео и почитал комментарии
Спасибо! отличное видео.
Можно вместо списка для артикулов использовать множество, тогда в строке артикулов не будет повторений dict.setdefault(key, set()).add(value) А при выводе использовать f-строку вместо строки с "+" и вставить sorted() в join, потому что множество выдает свои элементы в случайном порядке string_values = ', '.join(sorted(value)) string_to_write = f'{key} = {string_values} '
@oldcoders
Жыл бұрын
👍👍 спасибо
@S_putnik
Жыл бұрын
А если через метод get?
@IvanIvanov-rp6og
Жыл бұрын
@@S_putnik Через метод get мне нравится больше
@nuklotron7465
Жыл бұрын
к тому же множества работают быстрее списков)
@user-ok2oo7pt2r
6 ай бұрын
@@IvanIvanov-rp6ogкак помню, если ключа нет то выводит ошибку
в 8:42 - чтобы посчитать кол-во столбцов - достаточно их выделить и посмотреть на "подсказку" которая будет появляться правее курсора. Подсказка вида: 1048576R x 12C
Словарь по итогу отсортирован по ключу, как строке (1.10, 1.11 идут впереди 1.2), а нужно как по числу. В программе не хватает вот этого последнего штришка. :)
@oldcoders
Жыл бұрын
Просто мне не нужно было это. Это задача не учебная а реальная. Такой сортировки более чем достаточно, времени тратить на ненужную «досортировку» - смысла нет. И видео усложнять - тем более.
Спасибо Большое
Ждем 3 часть про Python Django
У вас преподавательский талант
Спасибо! Подписка.
Супер!
Познавательно и круто! Спасибо за видео и разъяснения. Однако, я хотел бы уточнить пару моментов. 1-й - кроме макросов в Excel есть прекрасный ETL в виде PowerQuery, где тоже самое можно сделать при помощи интерфейса и нескольких кликов мышки. 2-ой - на 17:50 видно, что сортировка не идеальна, т.к. после. п.3.1. (20 строчка в IDE) идёт п.3.10. (21 строчка в IDE), а ещё ниже п.3.2. (26 стока в IDE). Подскажите, пожалуйста, как это скорректировать? Спасибо!
@oldcoders
Жыл бұрын
Да, можете почитать в комментариях, об этом уже рассуждали. Чуть более сложную сортировку пришлось бы делать. Например отделять номер от названия подкатегории, переводить его в тип float , сортировать его и т.д. Мне это было не нужно, такой первичной сортировки было достаточно.
Пришлось перейти с vba на python в связи с задачей где vba уже не тянет: надо было обрабатывать и рассчитывать с высокой точностью по данным в excel файлах размером порядка 300-500 mb (500 тыс. строк и 150 столбцов) за 10 лет (в результате сформирован dataset на 15 gb). Столкнулся с проблемой библиотеки openpyxl - непредсказуемая обработка чисел: то например вместо исходного числа 0,3 выдает 0,2999999, или вместо -0,002 -2e-3. Пришлось оборачивать дополнительными функциями. Может есть какие-нибудь опции чтобы подавить такую обработку?
@oldcoders
7 ай бұрын
docs-python.ru/tutorial/operatsii-chislami-python/problemy-chisel-plavajuschej-zapjatoj/ здесь не дан ответ вам? А вообще с такими большими объемами данных вам уже лучше смотреть на Базы Данных. Они работают быстро, четко, им хоть миллионы строк нипочем. Один раз загнать ваш датасет в БД и уже с БД работать.
@tsvjatoslav
7 ай бұрын
Используй библиотеку pandas
Вот бы видео на этом канале появлялись чаще!
@oldcoders
Жыл бұрын
На этой неделе выйдет новое. Из этой же серии «пишу реальную программу»
Библиотека Pandas имеет хороший функционал по таблицам, выборкам, группировкам, вводу/выводу файлов и т.д. Спасибо за видео!
@oldcoders
Жыл бұрын
Да, я ее использую. В этом видео нет.
@andreyflash6001
Жыл бұрын
Тоже про Pandas подумал. Но в исходном excel файле (в названии столбцов таблицы) заметил объединённые ячейки. У меня Pandas такое читать отказывается. Есть вообще способ открыть excel файл с объединёнными ячейками через Pandas?
Спасибо интересно. Один вопрос если у нас в исходном файле будет за двоенная строка (Артикул + Подгруппа товара), то и в финале два одинаковых артикула в подгруппе товара выйдет? Если да, то как дописать проверку, и может добавить вывод дублей в отдельный файл для правки исходника. А то ошибка в одной цифре артикула и песчаная толстовка идет как черная.
1. if else обычно стараются сократить. Я бы сделал "в случае если в словаре нет ключа" - создад запись с ключем где значение будет пустой массив. А потом аппендить туда значения без елсе. Мне так комфортнее) Не знаю кому как. Ну и еще одно замечание. А самое главное замечание кеоторое мне бросилось в глаза - сортировка не верная. Потому что саб категория должна сортироваться 1.1, 1.2, 1.3, ...., 1.10 а не 1.1, 1.10, 1.2. Для этого когда складываем в словарь можно сразу сделать category_dic и subcategory_dic и во втором писать только второе число подкатегории. И сортировать его как число а не как строку. В целом такая структура будет удобнее для дальнейшего использования.
Привет! Спасибо за видео! Классная идея с обучением на реальной задаче. Немного душных комментов по самому видосу - слишком много внимания берут на себя перебивки с музыкой, я бы музыку или подрезал или вообще убрал. Если добавить в начале что-то типа оглавления - так будет смотреть еще интереснее. Можно еще рассказать сколько времени заняла работа и сколько за это могут заплатить) спасибо за видос! Афтор пеши исчо
@oldcoders
Жыл бұрын
Есть же оглавление - разделы под видео. За такую программу никто платить не будет, это минимальный базовый уровень владения языком. Времени заняло минут 30. За советы спасибо!
Я бы воспользовался defaultdict из модуля collections тем самым объявив бы values словаря с типом list
Деды вперед!
@oldcoders
Жыл бұрын
Воистину вперед!
Спасибо за интересное видео. Но если говорить о том какой тип данных идеален для решения данной задачи - то это конечно же классическая задача для defaultdict - словаря со значением по умолчанию)..
@oldcoders
Жыл бұрын
Да, многие написали про этот метод, спасибо!!
Спасибо, вполне полезно
Отлично!
Спасибо за видео, очень нравится этот формат! Не совсем понял момент с sku: вы ж не объявляли эту переменную как list, как это работает?
@oldcoders
Жыл бұрын
А sku это и не лист никакой. Лист это значение словаря, в котором элементами являются sku. subcategories_dict[subcategory]=[sku] Вот здесь список и объявляется.
@mishamishin5239
Жыл бұрын
@@oldcoders Понял, спасибо большое за ответ!
Дед, спасибо. Всё как по учебнику - если код нельзя прочитать как предложение, этот код нужно переосмыслить.
Используйте f-строки, а не конкатенацию в чистом виде,f-строки прекрасны! Спасибо за ролик!
Большое спасибо за ролик, подскажите пожалуйста что за ide используется?
@oldcoders
Жыл бұрын
PyCharm Community
Я бы словарь сортировал иначе, через генератор, как кто-то предложил If/else при записи можно заменить конструкцией dict[key] = dict.get(key, []) + [value] Если нет значения по ключу, он в него записывает пустой список и конкатенирует со списком значения Либо dict.setdefault(key, []).append(value) И при создании результирующей строки использовал f-string Получилось бы что-то типа String_write = f”{key} = {‘, ‘.join(value)} ” - здесь сразу список значений распаковывается в строку с разделителями) вообще познав однажды f-строки невозможно их разлюбить
Здравствуйте! Будут ли ещё выпуски с задачами Codewars?
@oldcoders
Жыл бұрын
Будут! Идей много, но я редко выпускаю видео, поэтому все затягивается
Добавление в список по ключу хорошо делать через dict.setdefault('key', []).append('item')
Как насчёт defaulteict from functools? Чтобы не развлекаться с условием проверки наличия ключа.
@oldcoders
Жыл бұрын
Да, defaultdict многие посоветовали, спасибо!
Спасибо Вам 🇧🇾🇧🇾🇧🇾🇧🇾
В поддержку.
Переменную string_towrite я бы записал через форматирование: f"{key}={string_values} "
А можно приделать какой то интерфейс к этой программе, что бы пользователь нажимал кнопочки, загружал файл и на выходе получал отсортированный эксель
@oldcoders
Жыл бұрын
Можно конечно. Просто мне это не нужно. Во первых я это только для себя делаю, зачем усложнять программу графическим интерфейсом. А во вторых - этот скрипт будет частью большого веб-приложения, там пользователь конечно уже будет нажимать на кнопку «загрузить подкатегории товаров» и выбирать файл.
А когда вы будете продолжения по Django делать ?
@oldcoders
Жыл бұрын
Буду, буду. Собираюсь с силами
@ongrustit
Жыл бұрын
@@oldcoders Спасибо вам большое за ваши труды, дай Бог вам силы продолжать снимать видео про Python и Django
Здравствуйте! Спасибо за материал! Просмотрел много комментариев к выпуску и не увидел, чтобы у кого-то возникала подобная ошибка: myfile.write(string_to_write) UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-11: ordinal not in range(128) Система macOS Подскажите, пожалуйста, как решить
@oldcoders
Жыл бұрын
Какая то ошибка с кодировкой, на какой то символ ругается. Вбейте в гугл эту ошибку, ответ найдется
Приветствую. А где можно скачать такой ексель файлик для примера?
@oldcoders
Жыл бұрын
Ой.. сделайте сами, там делов то. Или с работы любой файл возьмите. Или уж в крайнем случае погуглите, эксель файл скачать. Какой нибудь прайс лист найдется уж.
Приветствую. Есть Pandas библиотека, которая тоже позволяет читать Excel файлы. Мне она показалась удобнее openpyxl.
@oldcoders
Жыл бұрын
Да, использую ее тоже. О ней будет отдельное видео.