Ответы пользователя по тегу Python
  • Что дешевле: переменные или массив?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Для вашего случая нет разницы. Нужно руководстоваться не соображениями производительности, а соображенями понятности кода. Если код легко воспринимать и легко модифицировать под изменения задачи в ближайшем прогнозируемом будущем, то это правильно написанный код.
    Судя по ашему вопросу, опыта у вас не так много.
    Вопросы прихводительности в таких вещах придут позже. Сейчас сконцентрируйтесь на алгоритмах, и побльше практики. Найдите ментора и отдавайте ему код на ревью. Читайте чужой код других проектов, чтобы набраться опыта и начитанности.
    Ответ написан
    Комментировать
  • Как работает это решение задачи с LeetCode?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Воспринимайте tail и head не в глобальном контексте, а локально. Это всего лишьпеременные с таким именем. Вкаждом конкретном случае и на каждой итерации они могут означать разные места связного списка.

    Представьте, что вас много, вы на соревнованиях, у каждого на груди номер и вас выстроили по неубыванию номера в колонну, попросив положить руку на плечо впереди стоящего.
    Некоторые номера повторяются и Солюшн Иванович (тренер) идёт вдоль вашей цепочки и делает в точности то, что написано в алгоритме.
    При этом там где он идёт, он расцепляет вашу цепочку формируя новую уже без дубликатов.
    При этом tail - это хвост новой цепочки, он на каждом шагу новый. Каждому новому хвосту следующим эементом (новым хвостом ставится очередной, но если у него отличный номер. Так тренер выпнет всех с неуникальными номерами из цепочки.

    Что конкрено не понятно?

    Вот поэкспериментируйте сами:
    class ListNode:
        def __init__(self, val, next=None):
            self.val = val
            self.next = next
    
        def __str__(self):
            tail = self.next and f', {self.next}' or ''
            return f'{self.val!r}{tail}'
    
        def __next__(self):
            if self.next:
                return self.next
            raise StopIteration
    
        def __iter__(self):
            item = self
            while item:
                yield item.val
                item = item.next
    
        def copy(self):
            return ListNode(self.val, self.next and self.next.copy())
        
        __repr__ = __str__
    
    
     ln=ListNode; l=ln(1, ln(1, ln(2, ln(3, ln(3)))))
    Ответ написан
    Комментировать
  • Как записать hashsum в файл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    вы все перепутали. Имя файла, которое указано у вас в конфгурации логирования, оно для лога. Вы можете изменить формат логирования, там есть соответствующий аргумент, а можете открывать надозапись совсем другой файл и писать в него как вам посоветовали в комментариях к вопросу.
    А вы, похоже, пытаетесь писать в тот же файл, куда уже пишутся логи. Логи, конечно, перезаписывают то, что вы туда пробовали писать самостоятельно.

    Так бывает когда пытаешься переделывать прогу совершенно не понимая что в ней творится. Наймите фрилансера на эту задачу за сто рублей, или учите питон с нуля, он вам может пригодиться и дальше
    Ответ написан
    Комментировать
  • Как быть с этой функцией?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Типо Начинающий кодер IT :D, в сообщении нельзя отпрвить видеоролик, который больше допустимого по объёму. Как отправить маленький ролик есть в документации к библиотеке, на которой реализован ваш бот.
    Большой фильм можно пересылать только в виде ссылки на страницу просмотра на каком-то ресурсе вроде ютуба, кинопоиска или нетфликсе, или ещё где-то. Невозможно в сообщении прислать фильм целиком в виде вложенного видеоролика. Не поместится.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот так:
    print(*[k for k,v in vars().items() if v == ['Яблоко', 'Груша', 'Арбуз']])

    Но думается мне вы не этого хотели.
    Просто начните с книжки, а не методом проб и ошибок. Сэкономите массу времени.
    Ответ написан
    Комментировать
  • Как работать с файлом SQL объемом 20 ГБ?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы выбрали плохой путь по ряду причин.
    Во-первых, вы пытаетесь вычитать весь 20гб файл в оперативную память. Это будет долго, отожрёт кучу свопа и не факт. что завршится успешно.
    Во-вторых, вы пытаетесь запустить весь SQL за один раз - это вы правильно поняли.ч то проблематично.
    Ну а в-третьих...
    В общем, следует глазами посмотреть в SQL и понять что там. Если там дамп БД, то сперва идут стейтменты для содания таблиц, индексов, хранимок, а потом уже операции вставки в эти таблицы.
    Ваш файл называется "часть 3", так что, возможно, часть нужных стейтментов для создания структур просто оказались в других фвйлах.
    Обычно кусок SQL, который создаст все таблицы, не так уж и велик по размеру. Можно открыть файлы с дампом текстовым редактором и вытащить оттуда куски SQL из начала с созданием структуры. Положить эти кусуи в отдельный файл. Иногда в SQL-файле с дампом лежит и команда создания базы, посмотрите внимательно.

    Когда у вас операции вставки данных в БД в отдельном огромном файле, всё тсановится чуточку проще.
    Если у вас задача одноразовая и нужно просто найти один номер и больше ничего, то можно просто воспользоваться командой grep на SQL файле. Она поищет нужный номер и покажет строчки, в которой он встретился. Параметры командной строки могут настроить выхлоп так, чтобы показывались несколько строчек. Это, возможно пригодится, если отдельные стейтменты со вставками занимают по много строк. Так можно быстро найти нужные данные не возясь с поднятием БД.

    Если задача более-менее систематическая, то, конечно, лучше выполнить SQL и занести все данные в БД. Для этого имеет смысл воспользоваться стандартными утилитами, а не городить такой вот велосипед с квадратными колёсами.
    Если описанные действия нужно проделывать в рамках какого-то более широкого автоматизированного процесса, а не одноразово руками, то можно тулзы для БД запускать и из питона, просто системным вызовом консольной команды.
    Ответ написан
    1 комментарий
  • Как работает перенаправление вывода скрипта python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Или вызывайте вот так:
    print(subprocess.getoutput('./1.py'))
    Так вы дождётесь полного выхлопа.
    Но если выхлопа много, то лучше запускать иначе, чтобы получить выходной пайп и вычитывая его в цикле слать всё на stdout __main__

    UPD: Дополню ответ, а то часть оказалась в комментариях.

    Такое происходит потом, что при перенаправлении выхлопа в файл происходит буфферизация. Накопительный буффер сбрасывается в файловую систему по факту своего заполнения или принудительно (по команде flush или по факту завершения процесса).

    При выхлопе, направленном в терминал, буфферизации нет и всё, что выводится, попадает в терминал сразу.
    Но если бы каждый байт писался в файловую систему без буффера, то это быо бы чертовски медленно и заставляло бы постоянно дёргаться картеку (реальную или виртуальную) лочного девайса, на котором у нас файловая система.
    Так и получается, что
    - сперва в stdout материнского процесса попадает некий текст,
    - потом запускаеется дочений процесс и что-то пишет в свой stdout,
    - потом дочерний процесс закрывается и сбрасывает накопившийся буффер, который перенаправляется по цепочке в выходной файл,
    - потом закрывается материнский процесс и весь его недозаполненный буфер тоже сбрасывается в файл.
    Ответ написан
    2 комментария
  • Как преобразовать список в словари?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Тут не поощряется публикация заданий без попытки самостоятельного решения.
    В ответе тоже не буду давать вам готового решения, поскольку это "медвежья услуга".

    Могу дать подсказку как решать вашу задачу.
    Во-первых, следует отметить, что во втором, заблокированном вашем вопросе, формат входных данных отличается от озвученного здесь. Нужно тщательнее и аккуратнее приводить примеры.
    Любую относительно сложную задачу нужно разбивать на блее простые подзадачи и решать их отдельно и изолированнно.

    В данном случае входной список вам следует сначала разделить на набор отдельных списков, где в каждом первым элементом будет ваш идентификатор, а дальше список ключей и значений. Это можно оформить отдельной функцией. В том, втором вопросе было видно, что разделить входную последовательность можно, например, по значению 'ID'. В примерах, приведённых здесь, нет такихэлементов, поэтому тут придётся ориентироваться на тип или четность...
    Когда у вас будет последовательность списков, первый элемент - ключ всего списка, легко отделить слайсом, а весь хвост можно легко превратить в пары ключ-значение вот таким вот способом:
    In [1]: lst=[1,2,3,4,5,6]
    
    In [2]: dict(zip(itr:=iter(lst), itr))
    Out[2]: {1: 2, 3: 4, 5: 6}


    Ну а если вы не сообразите, как увязать воедино все приведенные мной тут примеры, то вам еще рано решать такие задачи, нужно сделать пару шагов назад и осваивать базовые основы языка.
    Ответ написан
    Комментировать
  • Почему скрипт не видит группу data?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Потому что вы два раза пытаетесь зачем-то спарсить http-ответ как JSON. Очевидно в Json один ответ.
    Вы ришли в магазин, запросили коробку конфет, вскрыли, получили список конфет и выкинули вместе с коробкой и конфетами.
    Потом снова делаете двидение руками, будто берете с прилавка коробку конфет (но ее там нет же, вы только одну запросили у продавца), лезете в воображаемую коробку рукой и не находите там конфету.
    Странно, правда?

    Если бы вы не нарушалиправило и не постили код в виде скриншотов, то я бы вам процитировал ваши ошибки и, наверно даже, написал бы как равильно делать.
    Но вы нарушаете правила.
    Ответ написан
    3 комментария
  • Есть ли в python библиотеки для создания графики в стиле MS DOS?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А в чем, собственно, у вас с этим проблема? Что особенного в этой графике? Пиксели крупные, ну так и вы нарисуйте пиксели крупные. Можно даже графический режим такой включить, но смысла мало, можно просто рисовать пиксели прямоугольниками.
    Я понимаю речь бы шла о текстовом режиме, но тут-то что такого MS-DOS'овского?
    PyGame и в путь.
    Ответ написан
    Комментировать
  • Почему csv writer не записывает все итерации, хотя должен?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Почему csv iterator не записывает все, хотя должен?

    Нет, не должен. Итератор не должен ничего записывать, он интератор. Итератор итерирует. Всё.

    Вот вы пришли с вопросом, но по какой-то причине не включили в него самое важное, то по чему можно определить причину такого повеения вашей программы.

    Во-первых, вы не привели примера данных. Если что-то идёт не так, как ожидается, ВСЕГДА нужно приводить два набора данных: тот, который работает как ожидается и тот, который как ожидается не работает. При этом не обязательно приводить полные наборы данных, ведь их может оказаться очень много. Всегда нужно стараться упростить непонятную ситуацию максимально, и в какой-то момен она станет понятной. Ну, то есть, возможных причин проблемы в рассмотрении станет достаточно мало, чтобы понять какая из них действительна.
    В данном случае нужно было убирать из CSV всё лишнее до тех пор, пока проблема сохраняется. Если убирать уже нечего, то останутся только проблемные записи и, возможно, посмотрев на них, вы сразу всё поймёте. Или поймёт тот, к кому вы пришли с вопросом.

    query = """variables_loaded[variables_iterator]['0']""" ##, так далее

    Во-вторых, у вас какой-то совершенно невалидный SQL-запрос. Он бессмысленный и неправильный. Вот это буквально текст, который запросом не является. Он даже не меняется от итерации к итерации, понимаете? Нам тут не ясно что вы имели в виду под "так далее", нам тут не ясно понимаете вы что такое SQL и что вот та строка им не является.

    При всех ваших ошибках в постановке вопроса нам тут уже не ясно, может быть у вас вообще нет работающего кода, который что-то записывет из CSV в БД, а то, что вы думаете он, якобы, запсывает, уже и так есть в БД, а вы просто этого не понимаете! Ну как не понимаете, что проблема может быть в SQL-запросе, поэтому его не приводите, как не понимаете, что проблема может быть в индексах и структуре БД, поэтому не приводите её структуры, как не понимаете, что проблема может быть в данных (они могут повторяься в разных строках CSV), а вы и не приводите все данные, и не говорите, что убедились, что они не повторяются!

    execute_query(connection, query)

    В-третьих, вы оставляете за скобками код выполнения SQL-запроса. Мы не знаем что это за код, может быть там вы тупо try-except'ом задавили все возможные ошибки и сами, фактически, отказались от того, чтобы БД вам объяснила в чем проблема. Может быть это вообе пустая функция внутри, или она неправильно обернута каким-нибудь декоратором, который ей не дает работать, а вы просто видите в БД одни и те же данные, и думаете. что они каждый раз туда заливаются вновь вот этим неработающим вообще кодом.

    Как нам судить обо всём этом букете гипотетических пробелм, если вы старательно все улики замели под ковер? Для чего вы это сделали?
    Ответ написан
    2 комментария
  • Запись, получение, хранение текстовой информации в Python, как реализовать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вам нужно многое понять и изучить прежде чем такая задача станет вам под силу. Судя по постановке вопроса вы очень далеки пока что от понимания основ алгоритмизации и структур данных.
    Конечно можно ставить любое уникальное значение любому объекту. Структура данных, которая это позволяет, называется map, а в питоне её реализует тип dict - это словарь, который ставит в соответствие любой объект любому уникальному другому объекту.
    Я уверен моего объяснения будет не достаточно вам. Почитайте любую книжку по питону с нуля, например, Марк Лутц пишет приемлемые.
    Ещё вам определенно понадобится какая-то БД, например sqlite, или что-то посерьёзнее, например postgres. Базы жанных - это тоже отдельный целый мир, но вам не нужно вних сильно углубляться, однако, одного вопроса, да и вообще вопросов будет недостаточно для нормального понимания.

    Я вам рекомендовал бы обратиться к фрилансерам за таким ботом, либо, если самому интересно, то читайте книжку по питону с нуля и там вам всё будет объяснено, что нужно для простого бота с вашей функциональностью.
    Ответ написан
    1 комментарий
  • Почему socket работает только в локальной сети? Как это исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Дело в том, что пока ваши устройства в одной подсети (им выдал адреса один DHCP сервер, это обычно ваш роутер), вы, указав локальный IP другого устройства в сокете, можете создать соединение.
    Но если устройства в разных локальных сетях, между которыми не настоен никакой роутинг, то устройства не смогут видеть друг друга. Их адреса будут в разных адресных пространствах.
    Это как звонить внутри отеля по внутреннему номеру телефона. Если один из абонентов окажется в другом отеле, то, даже зная его внутренний номер, вы из первого отеля не дозвонитесь ему напрямую по короткому номеру. Придётся пользоваться шлюзом. Вот шлюз - это NAT.
    Тут дальше аналогия уже поплывёт, если ещё глубже пытаться её применять.
    Прочитайте что такое NAT, что такое белый IP, динамический и статический IP, что такое port-forwarding, сетевая модель OSI, что такое маска подсети и как устроен IP-адрес, как происходит маршрутизация.
    Это слишком много инфы, чтобы рассказывать вам об этом в ответе на один вопрос. Вам нужно изучать это самостоятельно.
    Ответ написан
    3 комментария
  • Что делать, если неработает скрипт?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Павел Панов
    про эту строку from collections.abc import Mapping то я незнаю как и куда её нужно вставить

    Выглядит так, будто вы немного забегаете вперед в изучении языка.
    Прочитайте в любой книге (например Марка Лутца) что такое импорты, как они работают, что за стандартная библиотека collections и что за "Mapping", как он переместился внутри стандартной библиотеки между версиями питона.
    Также можно поискать историю версий питна и почитать когда произошел перенос Mapping, можно выбрать нужную версию интерпретатора, под которую написан ваш скрипт.
    Скорее всего это какой-нибудь 2.7. более точные выводы делать не по чем.
    Ответ написан
  • Можно ли как-то огранчить opencv по поиску объектов на изображении?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Да просто обрежьте картинку перед тем как отдать opencv и все.

    Дополню.
    Конечно обрезать надо не вручную, а той же самой opencv.
    Ок, таблица может быть где угодно, но внешняя рамка-то всегда на своем месте?
    Вообще не очень ясно что там у вас за PDF-ки. Если такие как в примере ровненькие и с одинаковыми полями, да рамочкой по ГОСТу, то просто кропайте картинку по этой рамке и все.
    Если поля плавают по размерам, то придётся искать границы и кропать по ним.
    Самое неудобное - это когда у вас сканы или фото документов, и они чуть под разными углами и искажены. Но в целом задача хоть и усложняется, но остается прежней.
    Можно найти вертикальные линии и взять самую длинную из самых левых - это левая граница рамки. С остальными так же.
    Обрезайте рамку полностью с небольшим запасом, потом ищите координаты таблицы, пересчитываете их в координаты на необрезанной картинке, добавляете с нужной стороны (в зависимости от того, с какой стороны у вас нашлась таблица) и снова вырезаете из оригинального изображения.

    И да, ненужные таблицы, особенно те, которые всегда на своем месте, можно перед поиском таблиц замазать белым прямоугольником с небольшим запасом. Но вырезать искомую таблицу надо по координатам с оригинала, чтобы края были корректными.
    Ответ написан
    7 комментариев
  • Как заставить даты поменяться?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Положите все даты в список, отсортируйте его.
    Сделайте цикл по элементам этого списка. В каждой итерации делайте ожидание текущей даты, а потом печать. И так дальше по списку.
    Ожидание можно сделать с помощью time.sleep. Нужно вычислить период между текущей датой-временем и очередной, выразить этот период в секундах.
    Ответ написан
    Комментировать
  • Как вытащить нужные данные из файла?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно реплейсить первый символ на "{", а последний на "}" (если там были не квадратные скобки, то валимся с ошибкой). Ну и предпоследний символ если запятая, то его удаляем.
    Ну и кавычку добавить придётся вторым символом.
    Если от валидного json ваш текст отличают только эти нюансы, то предложенного выше будет достаточно, потом просто парсим как json.

    Ещё можно без модификаций этот текст загрузить как yaml стандартной библиотекой.
    При этом вы получите список из трёх элементов:
    1) строка 'created_at":"2022-08-11T14:01:46.886Z"'
    2) Словарь с одним элементом: {'city': 'Lawton'}
    3) Словарь с одним элементом: {'country': 'US'}
    Ну а что с этим потом делать - уже разберетесь.
    Yaml гораздо больше вольностей в своём формате допускает.
    Ответ написан
    5 комментариев
  • Как работать с БД из другого класса?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Из приведённого кода не понятно для чего вообще выделен класс Sql.
    Фактически вы используете только один метод этого класса, а содержимое конструктора можно разместить в том же методе.
    Бессмысленно и беспощадно.
    Самое правильное - это делать всё как можно проще.
    Вот два очень полезных принципа в разработке:
    - https://ru.wikipedia.org/wiki/KISS_(принцип)
    - https://ru.wikipedia.org/wiki/Бритва_Оккама

    В приведённом вами куске кода не нужен класс sql, достаточно сделать всё внутри одной функции, ведь вы не используете созданный обьект больше никак.
    Другой вопрос, если вам нужно делать много запросов в рамках одного подключения к БД. На подключение тратяся некоторые накладные расходы по времени и трафику, иногда логично вынести подключение и хранить его в выделенном персистентном состоянии, которое будет создано один раз и переиспольовано для множества запросов. В этом случае закрывать коннект после запроса нельзя.
    Прочитайте вот: https://pavel-karateev.gitbook.io/intermediate-pyt...
    Обычно коннект к БД уже является менеджером контекста. Для чего вы делаете вот эту бессмысленную обёртку вокруг - не ясно.
    В соответствии с хоошим стилем прогаммирования нужно, чтобы действие любой функции можно было охарактеризовать простой короткой фразой без союзов, без "и" и "или", без "если".
    Иначе эту функцию стоило бы разбить на более мелкие и простые функции.
    Вот ознакомьтесь с концепцией чистой функции: https://dvmn.org/encyclopedia/clean_code/decomposi...
    Ответ написан
    2 комментария
  • Как расшифровать Exit code?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы поставили ограничение глубины стека таким большим, что память заканчивается задолго до достижения этого лимита, поэтому ваш процесс интерпретатора падает не показывая валидную ошибку.
    Не стоит делать такой неадекватный лимит стека, тогда ваш интерпретатор упадёт с другой ошибкой - превышен лимит рекурсивных вызовов.
    А уж эту проблему решать надо оптимизацией алгоритма. Ваш слишком жаден до стека.
    Ответ написан
  • Как сделать бот в Телеграм без приставки bot на конце?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Есть Telegram bot API - это для ботов. А есть Telegram client API - это для приложений, вполняющих функции клиентской стороны. То есть если вы задумаете написать свой клиент для телеграмма, то будете пользоваться этим API. Некоторые злоупотребляют правилами и делают ботов с использованием этого API, чтобы боты ритворялись реальными аккаунтами. За это, по идее, должны банить.
    Не надо делать таких ботов. Для чего вам?
    Ответ написан
    1 комментарий