Pyhon + Pandas + OpenPyXl = Excel, запись и редактирование

แชร์
ฝัง
  • เผยแพร่เมื่อ 18 ธ.ค. 2024

ความคิดเห็น • 54

  • @AzzraelCode
    @AzzraelCode  6 หลายเดือนก่อน

    Спасибо Автору azzrael.ru/spasibo

  • @photo_graf_khv
    @photo_graf_khv 10 หลายเดือนก่อน

    Спасибо тебе друг! Измучался я с директорией для сохранения. Это пролило свет на мои ошибки.

  • @ExcelStore
    @ExcelStore 3 ปีที่แล้ว +4

    Все очень понятно, разложили по полочкам. Спасибо за урок!

  • @Bkmz58
    @Bkmz58 2 ปีที่แล้ว +1

    Много пересмотрел всего по теме, ваша подача самая адекватная! Респект👍

  • @ДмитрийСемёнов-ъ1ь
    @ДмитрийСемёнов-ъ1ь 2 ปีที่แล้ว

    Оу! Это самое полезное видео за последнюю неделю! И я не шучу ))

  • @АскарКабаев
    @АскарКабаев 11 หลายเดือนก่อน +1

    вы лучшие

  • @samozhit
    @samozhit 2 ปีที่แล้ว +3

    Благодарю за приятную подачу! Складывается ощущение тепла и уюта, поэтому хочется смотреть другие видео :))
    У меня вопрос: я хочу задеплоить бота на сервер. Подскажите, пожалуйста, какой путь в переменной xlsx_path мне стоит указать?
    Очень надеюсь на вашу помощь, так как долго не могу сообразить, как мне это сделать🙏

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว

      За теплые слова спасибо, приятно ;)
      В видосе xlsx выкладывается в корень проекта и все должно работать в тч и на сервере (ну правда лучше ос зависимый сепаратор не использовать, а брать os.path.join например). Если вы хотите выложить таблицу в папку вне проекта, то нужно использовать абсолютный путь (/home/web/x.xlsx или c:\tmp\x.xlsx).
      Также рекомендую полистать например это stackoverflow.com/questions/25389095/python-get-path-of-root-project-structure

    • @samozhit
      @samozhit 2 ปีที่แล้ว

      @@AzzraelCode благодарю за ответ:))
      Я сделал точно так же, как показано в видео, задеплоил на heroku и во view logs выдает ошибку: OSError: [Errno 30] Read-only file system. Если есть такая возможность, подскажите, пожалуйста, что в этом контексте означает ошибка и куда направить внимание?

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว

      Я оооочень давно не работал с Heroku. Но, насколько я помню, для root скриптов в Heroku на запись доступна только ./tmp. Т.е. писать даже в папку с проектом нельзя. Соотв. попробуйте указать путь ./tmp/x.xlsx

    • @samozhit
      @samozhit 2 ปีที่แล้ว +1

      @@AzzraelCode От души благодарю вас!)))) Наконец-то разобрался и код работает!!! :)))
      PS код заработал 3 минуты назад, поэтому я счастлив :)))))) Спасибо большое!))

  • @joflow7484
    @joflow7484 2 ปีที่แล้ว +1

    Не получается что-то(( Есть код и очень много строк. По выполнении кода и сохранении в Эксель, выходит ошибка, что превышено максимальное количество строк, поэтому пытался разбить сохранение данных не на один лист, а на несколько. Не получается:(

  • @AzzraelCode
    @AzzraelCode  3 ปีที่แล้ว +6

    Местами я заглядываю внутрь Pandas, это не то что нужно знать обязательно, можно перематывать, но мне иногда было интересно почему оно так работает...

    • @nikita6625
      @nikita6625 2 ปีที่แล้ว +1

      Не, не, не, это надо, спасибо, таким образом я понимаю как смотреть на библиотеку с другой точки зрения, а еще когда сам знал и смотришь пояснение, это прочнее откладывается в голове, спасибо!

  • @wasimint1314
    @wasimint1314 2 ปีที่แล้ว

    Спасибо за ролик и объяснения!
    У меня Append без указания engine (engine="openpyxl") не работает
    Ваши комментарии помогли посмотреть причины.
    ✌💪❤

  • @АнатолийГО-ж2п
    @АнатолийГО-ж2п 2 ปีที่แล้ว

    Добрый день, а где найти видео про датафрейм?Хотел бы узнать, откуда в этом экселе уже появился этот датафрейм

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว

      В самом начала видео видно что датафрейм считан из csv файла записан с помощью метода Pandas df.to_excel.

  • @python689
    @python689 2 ปีที่แล้ว

    Подскажите, плз, почему при записи данных в excel, сохраняются данные только с первой страницы.
    path = 'business.xlsx'
    df = pd.DataFrame(items_list)

    with ExcelWriter(path, engine='openpyxl', mode='a' if os.path.exists(path) else 'w') as writer:
    df.to_excel(writer, sheet_name='New', index=False)

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว

      Не понял вопрос. Что значит данные с "первой страницы"? С какой первой страницы? У вас просто массив двумерных данных, вы складываете их в таблицу. Проблемы не вижу.

  • @ПавелКовынев
    @ПавелКовынев 2 ปีที่แล้ว

    Добрый день! А как на один лист добавить несколько pd.Series, я так и не нашел информации.И нужна подсказка: мне нужно , чтобы на экран выводилась gui в виде таблицы, которую пользователь заполнял (tkinder явно не походит, но думаю в районе sql искать), и дальше эта таблица фигурировала уже как pd.Series.Спасибо

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว

      Серия - это список, те в представлении таблицы - строка или колонка.
      Датафрейм собирается из серий в нужном порядке и пишется в таблицу.
      При чтении получаете из таблицы датафрейм, а из дф выбираете нужную серию.

  • @dreamofyou00
    @dreamofyou00 3 ปีที่แล้ว

    Очень классный формат когда разбирается что может пойти не так! Вопрос: при перезаписи можно ли сохранить формат ячеек, как календарный день, или валюты, например доларный?

    • @AzzraelCode
      @AzzraelCode  3 ปีที่แล้ว +1

      В видео несколько вариантов для перезаписи. Если использовать openpyxl напрямую, т.е. по схеме:
      wb = ox.load_workbook(path)
      wb[sheet_name].cell(startrow + ir, starcol + ic).value = _df.iloc[ir][ic]
      то да, формат сохраняется.

  • @сергейцыганов-я9и
    @сергейцыганов-я9и 2 ปีที่แล้ว

    Я так понимаю, что возможности дозаписать данные в конкретные столбцы силами только ExcelWriter не получится?

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว

      Именно ExcelWriter на данный момент нет. Но можно же использовать OpenPyXl.

    • @сергейцыганов-я9и
      @сергейцыганов-я9и 2 ปีที่แล้ว

      @@AzzraelCode это да

    • @CatWorldson
      @CatWorldson 2 ปีที่แล้ว

      Почему? Читаем данные, дополняем, перезаписываем

  • @DomNaPechi
    @DomNaPechi ปีที่แล้ว

    Почти ничего не понятно для новичка (из-за скорости пояснений и перепрыгиваний явно знающего человека), но интересно )) Одного не увидел - можно ли при сохранении таблицы в эксель делать форматирование столбцов (центрирование текста, например и автоматическую ширину по тексту делать)? У меня, после csv формата таблица выглядит печально ))

    • @AzzraelCode
      @AzzraelCode  ปีที่แล้ว

      Немного про стилизацию с помощью OpenPyXl у меня есть в ролике
      th-cam.com/video/dn3Oi7oaMT4/w-d-xo.html
      Можно что-то найти здесь
      stackoverflow.com/questions/26671581/horizontal-text-alignment-in-openpyxl
      --
      Ну а что касается скорости, к счастью на TH-cam, есть кнопка кот позволяет адаптировать скорость контента. Сам англоязычные ролики бывает смотрю на 0.75-0.5, нормально заходит.

  • @АнтонК-ы8й
    @АнтонК-ы8й 2 ปีที่แล้ว

    Почему не удается открыть созданный таким способом файл в экселе? Пишет не удается открыть т.к. формат или расширение недопустимы, расширение указано верно.

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว

      В видео как минимум 3 способа. Сделайте пастебин/SO вашего кода.

  • @p_r_o_e_k_t_o_r
    @p_r_o_e_k_t_o_r 8 หลายเดือนก่อน

    А в контректную ячейку как добавть данные?

    • @AzzraelCode
      @AzzraelCode  8 หลายเดือนก่อน

      Просто формируете двумерный массив с данными в нужной ячейки а потом пишете этот массив в файл.

    • @p_r_o_e_k_t_o_r
      @p_r_o_e_k_t_o_r 8 หลายเดือนก่อน

      @@AzzraelCode можно пример увидеть?

  • @alexeykuleshov5252
    @alexeykuleshov5252 ปีที่แล้ว

    А как в существующий файл добавить лист с текущей датой в названии? Т.е. каждый день - новый лист

    • @AzzraelCode
      @AzzraelCode  ปีที่แล้ว

      Например так
      title = date.today().strftime("%d/%m/%Y")
      wb.create_sheet(title)
      openpyxl.readthedocs.io/en/latest/tutorial.html

  • @rustamgroza9692
    @rustamgroza9692 2 ปีที่แล้ว

    Как отсортировать файл Эксель , чтобы в столбцах было всё по порядку

  • @НиколайЦой-в7п
    @НиколайЦой-в7п 2 ปีที่แล้ว

    wb[sheet_name].cell(startrow + ir, starcol + ic).value = _df.iloc[ir][ic]
    AttributeError: 'MergedCell' object attribute 'value' is read-only
    Что то меня сломало.... Возможно, недостаточно внимательно смотрел ролик. Если подскажите, буду благодарен)

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว

      По телу ошибки неплохо гуглятся варианты ;)
      Вот например stackoverflow.com/questions/59663517/openpyxl-attributeerror-mergedcell-object-attribute-value-is-read-only/

    • @НиколайЦой-в7п
      @НиколайЦой-в7п 2 ปีที่แล้ว

      @@AzzraelCode я гуглил, нашел в том числе и этот форум, ничего не понял, если честно. Почему ровно тот же код, что из видео может не работать?

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว +1

      В примере в видео, в таблице, нет MergedCell, в вашей таблице, судя по тексту ошибки, есть и вы пытаетесь в записать в ячейку в этом диапазоне. По ссылке на SO есть пример почему это не срабатывает, вылетает ошибка и что с этим делать.
      Если почти дословно перевести топовый ответ, то вам нужно писать в top-left ячейку объединенного диапазона. Т.е.:
      - если у вас объединены B2:D2, то писать надо в B2. Е вы попробуете писать в C2 или в D2, то получите ошибку 'MergedCell' object attribute 'value' is read-only.
      - если B2: Z33, то писать тоже нужно в B2

  • @KurFatoff
    @KurFatoff 2 ปีที่แล้ว

    Как вы посмотрели функцию toExcel?

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว +1

      Это стандартный функционал почти любой IDE. У JetBrains это вот www.jetbrains.com/help/rider/Navigation_and_Search__Go_to_Declaration.html

  • @alexeykazmin7539
    @alexeykazmin7539 ปีที่แล้ว

    Зачем выкладывать видео без ссылки на полный код. Типа смотрите как могу!

    • @AzzraelCode
      @AzzraelCode  ปีที่แล้ว

      Уговорили, не буду выкладывать))

  • @CatWorldson
    @CatWorldson 2 ปีที่แล้ว

    Что еще за 'фальш')))))

  • @wcdmovie2841
    @wcdmovie2841 2 ปีที่แล้ว

    Помогите пожалуйста, я недавно начал изучать программирование, пытаюсь разобраться. Столкнулся с проблемой:
    def kal4(freq_info, level_info, sensor2_info, xlsx_path: str, kal4, startcol: int=1, startrow: int=1, sheet_name : str="Калибровка 4"):
    kal4 = pd.DataFrame({'Время':[today.strftime("%d/%m/%Y-%H:%M.%S")],
    'Частота': [freq_info[0:10]],
    'P генератора': [level_info[0:6]],
    'Датчик 2': [sensor2_info[0:6]]})
    print(kal4)
    xlsx_path = os.path.dirname(__file__) + r"
    esults.xlsx"
    wb = ox.load_workbook(xlsx_path) # открываем файл
    for ir in range(0, len(kal4.iloc[ir])): # перебираем строки
    for ic in range(0, len(kal4[ir])): # перебираю данные из датафрейма
    wb['Калибровка 4'].cell(startrow + ir, startcol + ic).value = kal4.iloc[ir][ic] # записываю данные в строки таблицы
    wb.save(xlsx_path)
    Взял ваш пример, но у меня не определяются ir ic. Пишет ошибку: UnboundLocalError: local variable 'ir' referenced before assignment.
    Мне нужно чтобы в мой файлик excel сохранялись и потом добавлялись значения при каждом замере калибровки, а главное чтобы предыдущие данные не стирались. Всего предполагается, что в excel-файле будет 6 разных листов.
    Изначально вообще сделал через pandas таким способом:
    old_kal4 = pd.read_excel('kal4.xlsx', sheet_name="Калибровка 4")
    frames = [old_kal4, kal4]
    result = pd.concat(frames)
    result.to_excel("kal4.xlsx", writer, sheet_name="Калибровка 4", index=False)
    И всё работало, предыдущие данные сохранялись и добавлялись новые. Но у меня получилось сделать только в разных excel файлах в связи с чем их у меня 6 штук, но я хочу сделать в одном. Помогите пожалуйста:)

    • @AzzraelCode
      @AzzraelCode  2 ปีที่แล้ว

      У вас тут ошибка for ir in range(0, len(kal4.iloc[ir])): вы используете ir в iloc до определения ir

    • @wcdmovie2841
      @wcdmovie2841 2 ปีที่แล้ว

      @@AzzraelCodeЯ просто не понимаю как правильно определить ir и ic. Я думал уже, что эти переменные определяются, когда не датафрейм записываю, а значения из какого-нибудь csv файла? Можете подсказать как правильно должна выглядеть функция?

    • @wcdmovie2841
      @wcdmovie2841 2 ปีที่แล้ว

      @@AzzraelCode пересмотрел код, действительно накосячил в строке:) Спасибо за видос!

  • @maximzyatkov3421
    @maximzyatkov3421 ปีที่แล้ว

    Для начала, хочется сказать "Спасибо", за такую подачу. Большинство роликов сводится к написанию кода в ролике, из которого новичку все равно, ни чего не понятно. Максимум, что можно сделать, это бездумно переписать. А тут, при минимуме написания кода, максимум информации, что для чего нужно и как это работает .
    А так же, хочу задать вопрос....Есть форма отчета в XL. C рамочками, формулами и прочим, туда записываются данные при помощи OpenPyXL. Т.к. количество данных может отличаться, форма сделана с запасом строк. После всего, хочется удалить лишние строки, но известные мне способы, не удаляют строку, как это делает XL, а удаляют данные из строки и передвигают остальные данные вверх. В результате, уезжают формулы и рамочки.
    Если знаете, как этого избежать, укажите хотя бы направление поиска или какими инструментами это можно делать. Дальше я сам))) Заранее спасибо. Если не удобно отвечать здесь, можно кинуть ответ сюда vk.com/id804309

    • @AzzraelCode
      @AzzraelCode  ปีที่แล้ว

      Что если писать в эти ячейки пустой текст?

    • @maximzyatkov3421
      @maximzyatkov3421 ปีที่แล้ว

      @@AzzraelCode не уверен, что понял.....
      допустим, исходная таблица в 10 строк, под ней строка с формулами. Заполняются 5 строк в таблице, остальные нужно удалить(что бы было красиво). Если это делать руками в XL ( через "удалить строку") все ок, формулы изменяются корректно. Если удалять при помощи Python, то формулы в XL сохраняются без изменений, но они сместились и стали работать не на те ячейки и диапазоны ячеек. Ну и рамочки всякие, то же сдвинулись, как будто из листа бумаги вырезали середину, а потом скеляли.

    • @maximzyatkov3421
      @maximzyatkov3421 ปีที่แล้ว

      т.е. получается, что нужен инструмент, который будет эмитировать удаление средствами XL ("удалить строку")