Это копия, сохраненная 31 мая 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Предыдущий >>1616384 (OP)
Литература:
Автоматизация рутинных задач ч.2 - https://anonymousfiles.io/3CBCoy1o/ <-- тут только одна книжка. Кто может, залейте её на ЯД к остальным.
Ещё книжки: https://yadi.sk/d/HQhhsBsq3TVRUq
Тоже книжки: https://yadi.sk/d/tArKKuQu3Kejuq
Больше книжек: https://yadi.sk/d/H-00n-UG3RSQem
Анон, вместо того, чтобы без разметки постить код, лучше шарь его через специальные ресурсы:
https://ideone.com/ - возможность постить листинги кода и онлайн-запуска, не требует регистрации
https://dumpz.org/ - можно постить листинги, не требует регистрации
https://pastebin.com/ - для листингов, регистрация не обязательна
https://www.codepile.net/ - можно расшарить код в том числе на редактирование, особая полезная опция - чат при каждом листинге, где можно код обсудить
https://pyfiddle.io/ - запуск python кода онлайн, но чтобы шарить, надо регистрироваться
#######################################
ЧаВо: https://github.com/TheKnightsWhoSayNi/info/wiki/Hat Актуальность примерно 2015 года
Вопросы-ответы:
А стоит ли читать Лутца, том номер N?
Мнения в треде разделены. Кто-то за (очень неплохая база даётся), кто-то против (слишком много воды и объём книг убивает всё рвение). В общем — решать тебе, книга вредна не будет, но ты можешь её просто не дочитать и забросить.
Стоит ли читать %книга_нейм%, если там питон версии 2.х?
Нет, не стоит. 100% есть более актуальная книга, для пистона 3.х
А что ещё можно читать?
Питон сам по себе очень хорошо задокументирован и для уровня начинающих, и для продвинутого. Смотри официальную документацию. Можно начать вот с этого https://docs.python.org/3/tutorial/introduction.html
Есть у кого на примете годный курс лекций по алгоритмам? Формат лекций мне как-то ближе, нежели просто чтение книги.
МФТИшный курс, например, https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0
Что можно почитать/посмотреть по многопоточности/параллелизации в питоне, да и вообще в целом?
Очень годный ролик на американском языке про многопоточность и асинхронность https://www.youtube.com/watch?v=MCs5OvhV9S4
А как учить джангу? Нахожу только книги по джанге 1.х
У джанги отличные доки (одни из лучших для пистоновских либ, имхо), почитай их для начала. Книгу по джанге можно читать и для версий <2, это не проблема, т.к. принципы остаются теми же. Для переката на 2.х хватит changelog`a или тех же самых доков/статей. Начни изучать с разбора учебного приложения с голосовалкой из официальной документации.
В ньюфаг-треде написано, что нужно начинать с SICP, чтобы научиться программировать
Вот, пожалуйста, та же самая программа, но переработанная под язык Python: http://composingprograms.com/ (нужно знать ангельский или уметь пользоваться переводчиком)
Дайте нормальные книжки на русском! Мы, блядь, не в пиндосии живём
Брат, смотри книжки по ссылкам в шапке, там есть и русские. Но помни, без языка ангелов твоя жизнь проходит мимо и ты обречён быть на обочине знаний и технологий.
82 тред. Даун.
Я думаю потому что в питоне нет переменных, а есть ссылки на объект. Ты ссылаешь на один и тот же обхект - список, его и сортируешь, ссылка обновляется.
мимо нуб бейте но не обоссыте плз
1) В питоне все объекты передаются по ссылкам.
2) Как ты настроил показ содержимого переменных в пайчарме?
Всё нашёл почем, но где про это читать что бы понять механику. Почему переменные не так же
Ничо не настраивал а чо ето ваще такое ?
pass
Что это за синтаксис, как гуглить? Я про объявление типов.
А понял да это режим отладки когда красную точку ставишь он сам так делает
Бесполезная хуита, даже ворнинги не показзывает. Только для доков и линтера и годится.
Мне pycharm подчеркивает, если я что-то не так делаю. Можешь еще mypy заюзать, у него бОльшая поддержка.
Я просто показать результат там и там
Ну вот выбрал я интерпретатор как в документации, и все так же.
Погугли что такое интерактивная консоль питона
ибо на хероку нет консоли(нету же?), а мне при запуске бота нужно ввести номер, получить на него код в телегу и вставить его обратно в консоль
или может как-то в докер файл можно засунуть обработку консольного ввода?
Обычно в библиотеках для телеги есть скрипт генерирующий сессию как файл. То есть телефон надо подтвердить только в первый раз, оно сгенерирует файл, и каждый следующий раз по файлу будет авторизоваться. Файл нужно закомитить
Гугли понятия "мутабельность" и "имутабельность".
Тлдр некоторые объекты изменяются, то есть мутируются, если с ними работать, другие нет. Списки мутабельны. Когда ты делаешь список.сорт(), то тебе не создаётся новый отсортированный список, а изменяется тот который ты хочешь отсортировать.
Если у тебя насколько переменных для одного списка, список все ещё один. Чтобы скопировать список в новую переменную используй функцию copy из модуля copy
>даже ворнинги не показзывает.
>Только для [...] линтера и годится
А кто тебе ещё должен ворнинги показывать? Компилятор?
У всех так?
Бегаю по офису и кричу, тут у нас все так себя ведут. Так что всё нормально, продолжай изучать.
А ка ты на ошибки в других областях реагируешь? Ну типа начала вода у тебя откуда-то капать, а ты даже не знаешь, откуда конкретно. Что делать будешь?
Сегодня например, надо было поставить pip, поставил походу не ту версию. Понял что сейчас блять начнётся. Решил просто снести пайчарм и установить заново, вместо него снес зачем-то анаконду, которая удалялась пол дня. Пошёл смотреть вебинар по сетям, потом подумал нахуй мне эти сети, пошёл спать
Есть несколько опций, я лично бахнул бы регекспы, потому что люблю:
import re
pattern = re.compile(".[0-9].")
A = ['m24534', 'hello', '13000']
B = [a for a in A if not pattern.match(a)]
Так в pr они блять за каждым углом, это же пиздец. Постоянно что-то не так, надо фиксить. Ладно бы писал спокойно код / изучал что-то
>(".[0-9].")
Там звёзды для точек. Ну, если регекспы знаешь, найдёшь. А если нет, то можно другой способ для тебя поискать.
Они везде за каждым углом, просто в остальных областях за тебя кто-то уже большую часть работы проделал и большинство ошибок предусмотрел. Как и в повседневном использовании компьютера: кран открыл - потекло видео с твича, закрыл - остановилось. А всякие водонапорные башни, очистные сооружения, воздушные клапаны - это тебя вообще не интересует. И тут ты такой приходишь и начинаешь рандомно свой дизайн насоса изобретать, естественно, у тебя "ошибки за каждым углом".
>Спасибо, но вот это не понял
Регекспы знаешь как работают? Там должно быть
pattern = re.compile(".∗[0-9].∗")
но макаба простые звёздочки съела, а ты не разобравшись скопировал, поэтому не работает.
Оно сделает не то, что ты просил, во всяком случае не то, что я понял ты просил. Расскажи, как ты понимаешь, оно сделает?
Вроде то, что просил
https://stackoverflow.com/questions/18082130/python-regex-to-remove-all-words-which-contains-number
>как ты понимаешь, оно сделает?
Удалит числа и слова с цифрами в своём составе.
Ты спрашивал про лист, а там работают над строками.
>Удалит числа и слова с цифрами в своём составе.
из строки
>Как насчёт списка строк?
Будет дропать всю строчку, если там есть хоть одна цифра.
>И ещё раз
Если ты совсем не понимаешь, как работают регекспы, то лучше воспользуйся первым способом из твоего ответа. Если не понимаешь и его, то можем попробовать разобраться по частям с ним, а вот регекспам я тебя учить не буду.
Спасибо.
>а вот регекспам я тебя учить не буду.
Что почитать для освежения памяти?
Инб4 документацию
React лучше что придумало человечество. Рекомендую ознакомиться, не пожалеешь.
Если с фронтендом особо никогда не работал - попробуй Вью, он проще Реакта (хотя Реакт все же популярнее и более востребованный пока)
тоже о нем задумывался, спасибо, попробую
Я однажды на Idle с Джангой работал, так что не надо тут.
Тогда 'asfa fs ' не пройдёт. Я лично не знаю, что у него там будут за строки, поэтому просто беру самый прямой (в моём понимании) путь. Найти цифры (регекспом, значит быстро), выкинуть, если успешно.
На маленьком списке может быть, но на большом тексте точно быстрее. Они на сишечке же.
.isalpha() на той же сишечке.
Дублирую из прошлого треда:
Аноны, посоветуйте материалы для вкатывания в асинхронность. Активно курю статейки и видосы по asyncio, но такое чувство, словно чего-то фундаментального не знаю, о чём в них не говорят.
message='From: {}\nTo: {}\nSubject: {}\nContent-Type: text/plain; charset="utf-8";\n\n{}'.format('from','to','Invite',text_encoded)
server = smtplib.SMTP_SSL('smtp.yandex.ru:465')
server.login('from', os.getenv('password'))
server.sendmail('from', 'to', message)
server.quit()
А приходит какая-то хуйня.Не русский текст. Подскажите
>Больше книжек: https://yadi.sk/d/H-00n-UG3RSQem
Вы их читали? Большинство из них в разделе "сети" используют c++ в качестве примеров... Говноеды ебаные.
Лалка, это значит что мне не дают готовых примеров.
За 24 часа выучи, ну и потрать пару дней без напряга на поиск работы, чтобы не получать минимальные 300к.
Большое спасибо.
Сем, анон, сколько не читал материалов по асинхронности в Питоне так особо из них не прояснил. Хотя как краткую шпаргалку https://www.aeracode.org/2018/02/19/python-async-simplified/ можно использовать
ЯННП.
Как можно написать класс, использующий встроенные в дата-тип функции? Это вообще используется где-нибудь?
Легко можно написать. https://ideone.com/WHCMd2
Всё как-то используется. Если тебе нет как использовать, значит ты не дорос ещё.
Ну тебе все равно от листа наследоваться нельзя по заданию, так что пиши свои магические методы
А, кажись, понятно, что имеется в виду, спасибо.
Есть две классические книги.
http://shop.oreilly.com/product/9780596528126.do
http://shop.oreilly.com/product/0636920023630.do
В питоне они чуть слабоваты, но в целом близко к PCRE.
Да, если дрочить по 8 часов в день, сможешь найти норм работу
import regex
text = "ûòthe okay ûòåêcnbc 123 ûó ûóbbcûóher normal"
clean_text = regex.sub(u'[^\p{InBasic_Latin}]', u'', text).strip()
clean_text
А выдаёт:
'the okay cnbc 123 bbcher normal'
А надо:
'okay normal'
Так это только на латинские. Туда же либо добавить на тольуо буквы условие - типа [A-z] или как-то так
import re
result = re.sub(ur'[^\x00-\x7F\x80-\xFF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF]', u'', text)
p.s. есть такая штука стаковерфлоу и там обычно есть почти все ответы
https://stackoverflow.com/questions/23680976/python-removing-non-latin-characters
По-моему, чистой регуляркой это не решается. Нужно матчить все слова и прогонять через коллбэк/эвал. Надо смотреть, есть ли такой функционал.
Вот, есть. https://docs.python.org/3/library/re.html#re.sub
Для риплейса можно вкорячить функцию и там фильтрировать.
Я о том не будет ли интерпретатор ругаться, если версии его в отличаются в изданиях?
Человек, который не делает ошибок, завладел бы миром за один месяц. Но человек, который не учится на своих ошибках, не владеет ничем. Конечно, если человек одновременно и умен и удачлив, он не повторит одну и ту же ошибку дважды. Но он может совершить одну из десятков тысяч ошибок, родственных ей. Семья ошибок так велика, что недостатка в глупостях, которые можно совершить, не ощущается никогда. Ошибку извиняет только возможность нажиться на ней.
Старина, к чему эти мучения? Попробуй реакт...
Прошу прощения, я даун, не отвечайте
Собственно, из-за if expression.
https://stackoverflow.com/questions/394809/does-python-have-a-ternary-conditional-operator
Могли бы уже тогда сделать без елс для иф однострочников, но хуй вам.
Как это - ничего? Собрался потом "ничего" передавать в другие функции? Если и так, то хотя бы None.
Так присваивания не будет, если не тру. Это другая конструкция с тем же синтаксисом.
А это?
f(g(h(123 if expr)))
Вся строчка не должна выполниться? Магия какая-то. Лучшее уж так:
if expr:
..f(g(h(123)))
if sys.version_info <= (3, 7):
sys.exit(1)
Только в конце может быть.
Тот, кто это писал, не понимает смысл ассертов, так что лучше как у тебя.
Ты еще сравниваешь? Пичарм за тебя код пишет, а ты только зарплату получаешь, ну и немношка делишься с джетбрейнс
Нах это всё, когда есть Idle
> Пичарм за тебя код пишет
Я так не отупею? Алсо
>немношка делишься с джетбрейнс
в чем отличия платной версии от бесплатной?
Например как можно сделать парсер тредов в /b/, если чтобы получить список новых тредов, надо проскролить вниз до упора?
Вроде можно просто парсить сразу /catalog.html ибо там все одним запросом подгружается, но мне интересно что делать в первом случае?
Забыл добавить, точно.
Без использования всяких индуских селениумов, где он браузер запускает и при тебе скролит все.
Ну да, так это и работает. Остаётся исследовать код конкретного сайта и узнать, что там отправлять нужно
[[ 'abcd', '1', '2', '3', '4'], [ 'efgh', '1', '2', '3', '4'] ...]
по циклу пробегаешься по всем массивам, внутри цикла преобразуешь ч-з map, чо тут сложного
>Без использования всяких индуских селениумов,
Зря, селениум отличная вещь и если у тебя сайт на сайте куча ЖСа, который грузит контент - без селениума будешь устраивать танцы с бубнами
алг
нач
для и от 0 до длина - 1
нц
..для ж от и+1 до и+5
..нц
....список[и + ж] = цел(список[и + ж])
..кц
кц
кон
А пайчарм и настраивать не надо, всё работает из коробки.
Я забыл у первого цикла добавить "шаг 5".
Достаточно походить по сайту и записать все ходящие запросы. Для этого есть куча тулз вроде fiddler, charles, burp suite.
Не всегда на поиск эндпоинтов есть желание или время, поэтому и приходится идти макака-веем.
Это так не работает. enumerate индексы сам считает, а не берёт их из слайса, так что красиво сделать не выйдет.
Вот такой вариант.
Страшненько, но работает.
for i, sub in enumerate(inp):
inp = sub[:-4] + [int(val) for val in sub[-4:]]
Некрасиво.
>>28952
Можно через
https://docs.python.org/3.8/library/itertools.html#itertools.islice
from itertools import islice
for a in A:
for i, element in islice(enumerate(a), 1, None):
a = int(element)
Но это тоже некрасиво. Сейчас попробую подумать через map().
>Некрасиво.
Хотя присмотрелся, нормально, пойдёт. Новый лист, конечно, делает, но вообще ничего так.
Такой вопрос, как в вскоде настроить пременные среды без создания .env и импорта dotenv
Допустим в пичарме есть вот такая менюфка, как тоже самое сделать в вскоде?
>Сейчас попробую подумать через map()
Ничего интересного не придумал, если кому-то было любопытно.
Всю жизнь писал super() и никто на меня не ругался. Впервые такое, че за хня?
Пишет еще "unresolved reference for super"
> Имеется файл с данными по успеваемости абитуриентов. Он представляет из себя набор строк, где в каждой строке записана следующая информация:
> Фамилия;Оценка_по_математике;Оценка_по_физике;Оценка_по_русскому_языку
> Поля внутри строки разделены точкой с запятой, оценки — целые числа.
Напишите программу, которая считывает файл с подобной структурой и для каждого абитуриента выводит его среднюю оценку по этим трём предметам на отдельной строке, соответствующей этому абитуриенту. Также в конце файла, на отдельной строке, через пробел запишите средние баллы по математике, физике и русскому языку по всем абитуриентам.
Sample Input:
Porter;85;92;78
Crossman;100;88;94
Backer;58;72;85
Sample Output:
85.0
94.0
71.666666667
81.0 84.0 85.666666667
>типо в Питоне 2.7 так нельзя, у меня 3.7.6 версия, ало бля
Если пишет что 2.7, значит 2.7, не спорь с машиной
Ну раз это математическая хуйня, то читаешь в двухмерный массив, а там среднее по строкам будет по студентам, а среднее по столбцам будет по предметам.
Значит у тебя где-то закрался 2й питон
значит у тебя для проекта выбран интерпретатор 2.7, ёпта
Или щас таким любой школотрон занимается?
На апворке сейчас пиздец на такое налетают, штук 20-30 за десять минут. Раньше такого не было.
Посчитай сколько постов про говноботов за несколько последних тредов и подумай еще раз.
Все возможные
Ладно, сделаю и так и так.
from itertools import combinations
from functools import reduce
shitz = []
for lengh in range(2, len(my_list)):
shitz.extend([reduce(lambda a,b: a*b, combination) for combination in combinations(my_list, r=lengh)])
с помощью itertools конечно же
from itertools import combinations
aa = combinations([1, 2, 3, 4, 5, 6], 2)
for a in aa:
print(a[0] * a[1])
Для пар цикл фор не нужен, а просто r=2. И редьюс под лямбдой тоже оверкилл, но я тоже только учусь.
Сори что забыл сказать
в доках питона есть примерный код функции combinations
https://docs.python.org/2/library/itertools.html
itertools.combinations(iterable, r)
Return r length subsequences of elements from the input iterable.
Combinations are emitted in lexicographic sort order. So, if the input iterable is sorted, the combination tuples will be produced in sorted order.
Elements are treated as unique based on their position, not on their value. So if the input elements are unique, there will be no repeat values in each combination.
Roughly equivalent to:
def combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = range(r)
yield tuple(pool for i in indices)
while True:
for i in reversed(range(r)):
if indices != i + n - r:
break
else:
return
indices += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool for i in indices)
в доках питона есть примерный код функции combinations
https://docs.python.org/2/library/itertools.html
itertools.combinations(iterable, r)
Return r length subsequences of elements from the input iterable.
Combinations are emitted in lexicographic sort order. So, if the input iterable is sorted, the combination tuples will be produced in sorted order.
Elements are treated as unique based on their position, not on their value. So if the input elements are unique, there will be no repeat values in each combination.
Roughly equivalent to:
def combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = range(r)
yield tuple(pool for i in indices)
while True:
for i in reversed(range(r)):
if indices != i + n - r:
break
else:
return
indices += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool for i in indices)
Спс
Методов и атрибутов больно дохера и не до конца ясно, как они взаимодействуют, вот есть у нас ListView, у него обязательный метод get_queryset, но по факту я даже не использую его а юзаю get_context_data, где также как и в функции-view строю словарь, который передастся в шаблон
мне надо [[1, 2], [3, 5], [2, 1] , [5, 3]]
Дублирующие-обратные списки убрать
что бы получилось [[1,2],[3,5]] они вперемешку все и их дохуя
Можно использовать только вложенные списки и вложенные циклы никаких сверх технологий.
Хочешь в АП на работу попасть, хитрец?
Надо просто в списке исключить вложенные зеркальные списочки. Они вложенные (списочки) всегда содержат по два числа[ [1, 2], [33, 42] , [2, 1], [42, 33] ] , списочков сколько угодно но количество четное потому что есть основной и есть зеркало. Мне пох какие оставлять главное что бы одна сторона зеркала была.
Просто делаешь обратный слайс через list[::-1], ну и удаляешь или делаешь новый список.
О спасибо забыл про срезы
Согласен, хуйню предложил. Прости, друг.
Предыстория
Делаю систему производственного планирования MES где есть блок автоматического составления производственного расписания с точностью до единицы операции, сама система у меня вообще на другом, но сам вычисляющий скрипт на Питоне (потому что на другом его нет).
https://github.com/guillaumebour/flexible-job-shop
У меня задача данные передать в этот скрипт в определенном формате и забрать оттуда, переконвертировав обратно в свою систему.
Счас пока тестирую, не могу понять нихуя, что на выходе выходит (только догадываюсь, где что). Для того, чтобы понять, нужно увидеть график.
Я в консоле запустил скрипт, он мне рассчитал по тестовым данным. И построил график,
Но график выводится в виде такого кода: https://pastebin.com/jPdrT9aW
Я гуглил, это вообще какой-то LaTeX - издательская система.
Блять, не понимаю, куда мне вставить эту простыню, чтобы вывелась моя диаграмма Ганта ?
Я тупой, там в конфиге нужно было тру поставить, чтоб в график выводило, а не экспортировало в latex. Это вообще не сюда.
Прошу помощи в одной задачке. Есть всякие лог файлы, в которых вперемешку идут сообщения. Задача в том, чтобы по некоему ID сообщения необходимо найти сообщения отправки и получения ответа от сервера, связать их, посчитать задержку и распарсить xml запроса и ответа.
С парсом xml вопросов нет, это я сделал, равно как и найти начало сообщения. Суть в том, как мне найти и закинуть в какую-нибудь временную переменную текст xml для дальнейшей обработки. Сложность заключается в том, что сообщения идут вперемешку и строка с телом xml идёт без ID, например:
09:33:17,640 [mess-id-10] Incoming message
09:33:17,642 [mess-id-1] Outgoing message
09:33:17,644 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
---
Вот тут тело xml
---
09:33:17,645 [mess-id-6] Retrieving info
09:33:17,647 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
-- ValidityCheck - Вот тут засада, т.к. сообщение валидации мне не нужно
09:33:17,647 [mess-id-10] Request validated
09:33:17,647 [mess-id-6] prepared XML document
09:33:17,651 [mess-id-2] <?xml version="1.0" encoding="UTF-8"?>
---
Ответ другого сообщения
---
09:33:17,651 [mess-id-2] Exit: LogHandler::invoke
09:33:17,659 [mess-id-1] <?xml version="1.0" encoding="UTF-8"?>
---
Ответ другого сообщения
---
Ну и так далее, в общем, в логах полная каша. Сложности добавляем ещё то, что ID сообщения может повторяться спустя полминуты, если предыдущее сообщение с таким же ID завершено (не важно как, успешно или нет), ну и то, что файлы размером около 500 МБ.
Как я его обрабатываю - открываю файл и ищу первую строку с текстом Incoming message, беру из неё ID сообщения, время и номер строки. Далее я вновь (sic!) открываю файл и с помощью itertools указываю строку от которой необходимо проводить поиск сообщения с таким же ID. Вот тут у меня проблема, т.к. я пока ищу конец сообщения по Outgoing message, но это неправильно, т.к. между этой строкой и телом xml-сообщения могу влезть другие сообщения. В общем, как только я нахожу конец сообщения, я распихиваю по переменным нужные мне данные и посылаю break. Закономерность такая, что тело xml-сообщения идёт сразу после строки [mess-id-1] <?xml version="1.0" encoding="UTF-8"?>, но я пытаюсь исключить из поиска ValidityCheck и у меня ничего не выходит:
for line in islice(pFs, iterBegin, None):
subLine += 1
if messageID in line and '<?xml version="1.0"' in line and 'ValidityCheck' not in next(pFs):
pass
xmlMessage = xmlMessage + str(subLine) + ' ' + line + next(pFs)
if messageID in line and messageEnd in line:
endTime = dt.strptime(line[0:12], '%H:%M:%S,%f')
Принт и так далее
break
Буду рад, если кто-нибудь поможет не кодом, так хоть логикой. Кстати, сам конец сообщения выглядит, примерно, так:
09:33:17,698 [mess-id-10] Outgoing message:
-- Тут могут быть другие строки
09:33:17,700 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
---
XML
---
09:33:17,700 [mess-id-10] Exit: LogHandler::invoke
Т.е., по хорошему, конец сообщения мне нужно искать по 'Exit: LogHandler::invoke' с условием, что за две строки перед этим будет идти <?xml version="1.0" encoding="UTF-8"?>, а на предыдущей строке не будет ValidityCheck. Как я полагаю, мне нужно искать '<?xml version' и 'Exit: Log' с одним и тем же ID и всё, что будет между ними мне и нужно, исключая ValidityCheck, но тут мне, пожалуй, не хватает знаний в таком количестве итераций и фильтрации строк, поэтому, я буду даже рад, если кто-нибудь подскажет какой инструмент для этого лучше использовать, а дальше я сам.
Если вам кажется, что я многого прошу, то простите и не пинайте.
Прошу помощи в одной задачке. Есть всякие лог файлы, в которых вперемешку идут сообщения. Задача в том, чтобы по некоему ID сообщения необходимо найти сообщения отправки и получения ответа от сервера, связать их, посчитать задержку и распарсить xml запроса и ответа.
С парсом xml вопросов нет, это я сделал, равно как и найти начало сообщения. Суть в том, как мне найти и закинуть в какую-нибудь временную переменную текст xml для дальнейшей обработки. Сложность заключается в том, что сообщения идут вперемешку и строка с телом xml идёт без ID, например:
09:33:17,640 [mess-id-10] Incoming message
09:33:17,642 [mess-id-1] Outgoing message
09:33:17,644 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
---
Вот тут тело xml
---
09:33:17,645 [mess-id-6] Retrieving info
09:33:17,647 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
-- ValidityCheck - Вот тут засада, т.к. сообщение валидации мне не нужно
09:33:17,647 [mess-id-10] Request validated
09:33:17,647 [mess-id-6] prepared XML document
09:33:17,651 [mess-id-2] <?xml version="1.0" encoding="UTF-8"?>
---
Ответ другого сообщения
---
09:33:17,651 [mess-id-2] Exit: LogHandler::invoke
09:33:17,659 [mess-id-1] <?xml version="1.0" encoding="UTF-8"?>
---
Ответ другого сообщения
---
Ну и так далее, в общем, в логах полная каша. Сложности добавляем ещё то, что ID сообщения может повторяться спустя полминуты, если предыдущее сообщение с таким же ID завершено (не важно как, успешно или нет), ну и то, что файлы размером около 500 МБ.
Как я его обрабатываю - открываю файл и ищу первую строку с текстом Incoming message, беру из неё ID сообщения, время и номер строки. Далее я вновь (sic!) открываю файл и с помощью itertools указываю строку от которой необходимо проводить поиск сообщения с таким же ID. Вот тут у меня проблема, т.к. я пока ищу конец сообщения по Outgoing message, но это неправильно, т.к. между этой строкой и телом xml-сообщения могу влезть другие сообщения. В общем, как только я нахожу конец сообщения, я распихиваю по переменным нужные мне данные и посылаю break. Закономерность такая, что тело xml-сообщения идёт сразу после строки [mess-id-1] <?xml version="1.0" encoding="UTF-8"?>, но я пытаюсь исключить из поиска ValidityCheck и у меня ничего не выходит:
for line in islice(pFs, iterBegin, None):
subLine += 1
if messageID in line and '<?xml version="1.0"' in line and 'ValidityCheck' not in next(pFs):
pass
xmlMessage = xmlMessage + str(subLine) + ' ' + line + next(pFs)
if messageID in line and messageEnd in line:
endTime = dt.strptime(line[0:12], '%H:%M:%S,%f')
Принт и так далее
break
Буду рад, если кто-нибудь поможет не кодом, так хоть логикой. Кстати, сам конец сообщения выглядит, примерно, так:
09:33:17,698 [mess-id-10] Outgoing message:
-- Тут могут быть другие строки
09:33:17,700 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
---
XML
---
09:33:17,700 [mess-id-10] Exit: LogHandler::invoke
Т.е., по хорошему, конец сообщения мне нужно искать по 'Exit: LogHandler::invoke' с условием, что за две строки перед этим будет идти <?xml version="1.0" encoding="UTF-8"?>, а на предыдущей строке не будет ValidityCheck. Как я полагаю, мне нужно искать '<?xml version' и 'Exit: Log' с одним и тем же ID и всё, что будет между ними мне и нужно, исключая ValidityCheck, но тут мне, пожалуй, не хватает знаний в таком количестве итераций и фильтрации строк, поэтому, я буду даже рад, если кто-нибудь подскажет какой инструмент для этого лучше использовать, а дальше я сам.
Если вам кажется, что я многого прошу, то простите и не пинайте.
Че-то ты путанно объяснил. Возможно, я не совсем понял, но я бы делал примерно так.
Читаешь построчно, после детекта начала пихаешь последующие строки в список, отбрасывая такие оформленные 09:33:17,700 [mess-id-10] по регекспу. Ну и после детекта конца прекращаешь.
>>29611
Пардон, объяснения не мой конёк. Вот лог, я из него убрал всякие данные ненужные, но суть осталась. Если посмотреть, то в нём полноценных законченных только два сообщения с ID 10 и 15. У обоих этих сообщений есть сам запрос в формате xml, валидация и ответ, тоже в формате xml. Вот мне нужно эти xml тушки вытащить и распарсить (кроме валидации), попутно замерив время между запросом и ответом. Т.е., если выполнить скрипт, то он вернёт мне информацию только по двум этим сообщениям.
Если просто пихать все строки между началом и концом сообщения в список, то скрипт нехило так память будет кушать, ИМХО.
09:33:17,640 [mess-id-10] Enter: LogHandler::invoke
09:33:17,640 [mess-id-10] Incoming SOAP request:
09:33:17,642 [mess-id-1] committing database transaction
09:33:17,642 [mess-id-1] releasing database connection
09:33:17,642 [mess-id-1] outputResponse..start
09:33:17,642 [mess-id-1] outputResponse..end
09:33:17,642 [mess-id-1] Enter: LogHandler::invoke
09:33:17,642 [mess-id-1] Outgoing SOAP response:
09:33:17,644 [mess-id-6] SUCCESS in query execution
09:33:17,644 [mess-id-6] response code from
09:33:17,644 [mess-id-6] XML API document
09:33:17,644 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>
09:33:17,644 [mess-id-10] Exit: LogHandler::invoke
09:33:17,645 [mess-id-6] <?xml version="1.0" encoding="UTF-8" ?>
<response>
<document>
<DOC_NAME>doc_name</DOC_NAME>
<OPERATION>Operation</OPERATION>
<details>
<VALUE>Value</VALUE>
</details>
</document>
</response>
09:33:17,645 [mess-id-10] we don't use access rights, so allow this object
09:33:17,645 [mess-id-10] we don't use access rights, so allow this object
09:33:17,645 [mess-id-10] we don't use access rights, so allow this object
09:33:17,645 [mess-id-6] Retrieving info
09:33:17,645 [mess-id-10] XSD validation file location
09:33:17,646 [mess-id-6] Assigning query data
09:33:17,646 [mess-id-6] Assigning query data
09:33:17,647 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
<ValidityCheck xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></ValidityCheck>
09:33:17,647 [mess-id-10] XMLReader to be used: org.apache.xerces.parsers.SAXParser
09:33:17,647 [mess-id-10] request validated against XSD in 0 ms
09:33:17,647 [mess-id-6] processing
09:33:17,647 [mess-id-6] prepared XML document
09:33:17,647 [mess-id-6] XML API document
09:33:17,648 [mess-id-10] database connection status=OK
09:33:17,649 [mess-id-10] executing query
09:33:17,650 [mess-id-6] <?xml version="1.0" encoding="UTF-8"?>
<CHANGES_REQUEST><document><VERSION/><DOC_NAME>doc_name</DOC_NAME><OPERATION>INSERT</OPERATION><details></details></document></CHANGES_REQUEST>
09:33:17,651 [mess-id-2] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,651 [mess-id-2] Exit: LogHandler::invoke
09:33:17,651 [mess-id-6] preparing a database call
09:33:17,651 [mess-id-6] registering parameter values for the database call
09:33:17,651 [mess-id-6] executing query
09:33:17,659 [mess-id-1] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,659 [mess-id-1] Exit: LogHandler::invoke
09:33:17,683 [mess-id-15] Enter: LogHandler::invoke
09:33:17,683 [mess-id-15] Incoming SOAP request:
09:33:17,687 [mess-id-15] <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>
09:33:17,687 [mess-id-15] Exit: LogHandler::invoke
09:33:17,687 [mess-id-15] we don't use access rights, so allow this object
09:33:17,687 [mess-id-15] we don't use access rights, so allow this object
09:33:17,687 [mess-id-15] we don't use access rights, so allow this object
09:33:17,688 [mess-id-15] XSD validation file location
09:33:17,688 [mess-id-4] SUCCESS in query execution
09:33:17,688 [mess-id-4] response code from
09:33:17,688 [mess-id-4] committing database transaction
09:33:17,689 [mess-id-4] releasing database connection
09:33:17,689 [mess-id-4] outputResponse..start
09:33:17,689 [mess-id-4] outputResponse..end
09:33:17,689 [mess-id-4] Enter: LogHandler::invoke
09:33:17,689 [mess-id-4] Outgoing SOAP response:
09:33:17,689 [mess-id-15] <?xml version="1.0" encoding="UTF-8"?>
<ValidityCheck xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><OperationConnectionInfo></OperationConnectionInfo></ValidityCheck>
09:33:17,689 [mess-id-15] XMLReader to be used: org.apache.xerces.parsers.SAXParser
09:33:17,690 [mess-id-15] request validated against XSD in 1 ms
09:33:17,691 [mess-id-15] database connection status
09:33:17,692 [mess-id-4] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,692 [mess-id-4] Exit: LogHandler::invoke
09:33:17,694 [mess-id-15] setting
09:33:17,696 [mess-id-15] executing query
09:33:17,696 [mess-id-15] SUCCESS in query execution
09:33:17,696 [mess-id-15] response code from
09:33:17,696 [mess-id-15] committing database transaction
09:33:17,697 [mess-id-15] releasing database connection
09:33:17,697 [mess-id-15] outputResponse..start
09:33:17,697 [mess-id-15] outputResponse..end
09:33:17,697 [mess-id-15] Enter: LogHandler::invoke
09:33:17,697 [mess-id-15] Outgoing SOAP response:
09:33:17,697 [mess-id-10] SUCCESS in query execution
09:33:17,697 [mess-id-10] response code from
09:33:17,697 [mess-id-10] committing database transaction
09:33:17,698 [mess-id-10] releasing database connection
09:33:17,698 [mess-id-10] outputResponse..start
09:33:17,698 [mess-id-10] outputResponse..end
09:33:17,698 [mess-id-10] Enter: LogHandler::invoke
09:33:17,698 [mess-id-10] Outgoing SOAP response:
09:33:17,700 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,700 [mess-id-10] Exit: LogHandler::invoke
09:33:17,700 [mess-id-15] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,700 [mess-id-15] Exit: LogHandler::invoke
>>29611
Пардон, объяснения не мой конёк. Вот лог, я из него убрал всякие данные ненужные, но суть осталась. Если посмотреть, то в нём полноценных законченных только два сообщения с ID 10 и 15. У обоих этих сообщений есть сам запрос в формате xml, валидация и ответ, тоже в формате xml. Вот мне нужно эти xml тушки вытащить и распарсить (кроме валидации), попутно замерив время между запросом и ответом. Т.е., если выполнить скрипт, то он вернёт мне информацию только по двум этим сообщениям.
Если просто пихать все строки между началом и концом сообщения в список, то скрипт нехило так память будет кушать, ИМХО.
09:33:17,640 [mess-id-10] Enter: LogHandler::invoke
09:33:17,640 [mess-id-10] Incoming SOAP request:
09:33:17,642 [mess-id-1] committing database transaction
09:33:17,642 [mess-id-1] releasing database connection
09:33:17,642 [mess-id-1] outputResponse..start
09:33:17,642 [mess-id-1] outputResponse..end
09:33:17,642 [mess-id-1] Enter: LogHandler::invoke
09:33:17,642 [mess-id-1] Outgoing SOAP response:
09:33:17,644 [mess-id-6] SUCCESS in query execution
09:33:17,644 [mess-id-6] response code from
09:33:17,644 [mess-id-6] XML API document
09:33:17,644 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>
09:33:17,644 [mess-id-10] Exit: LogHandler::invoke
09:33:17,645 [mess-id-6] <?xml version="1.0" encoding="UTF-8" ?>
<response>
<document>
<DOC_NAME>doc_name</DOC_NAME>
<OPERATION>Operation</OPERATION>
<details>
<VALUE>Value</VALUE>
</details>
</document>
</response>
09:33:17,645 [mess-id-10] we don't use access rights, so allow this object
09:33:17,645 [mess-id-10] we don't use access rights, so allow this object
09:33:17,645 [mess-id-10] we don't use access rights, so allow this object
09:33:17,645 [mess-id-6] Retrieving info
09:33:17,645 [mess-id-10] XSD validation file location
09:33:17,646 [mess-id-6] Assigning query data
09:33:17,646 [mess-id-6] Assigning query data
09:33:17,647 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
<ValidityCheck xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></ValidityCheck>
09:33:17,647 [mess-id-10] XMLReader to be used: org.apache.xerces.parsers.SAXParser
09:33:17,647 [mess-id-10] request validated against XSD in 0 ms
09:33:17,647 [mess-id-6] processing
09:33:17,647 [mess-id-6] prepared XML document
09:33:17,647 [mess-id-6] XML API document
09:33:17,648 [mess-id-10] database connection status=OK
09:33:17,649 [mess-id-10] executing query
09:33:17,650 [mess-id-6] <?xml version="1.0" encoding="UTF-8"?>
<CHANGES_REQUEST><document><VERSION/><DOC_NAME>doc_name</DOC_NAME><OPERATION>INSERT</OPERATION><details></details></document></CHANGES_REQUEST>
09:33:17,651 [mess-id-2] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,651 [mess-id-2] Exit: LogHandler::invoke
09:33:17,651 [mess-id-6] preparing a database call
09:33:17,651 [mess-id-6] registering parameter values for the database call
09:33:17,651 [mess-id-6] executing query
09:33:17,659 [mess-id-1] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,659 [mess-id-1] Exit: LogHandler::invoke
09:33:17,683 [mess-id-15] Enter: LogHandler::invoke
09:33:17,683 [mess-id-15] Incoming SOAP request:
09:33:17,687 [mess-id-15] <?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body></SOAP-ENV:Body></SOAP-ENV:Envelope>
09:33:17,687 [mess-id-15] Exit: LogHandler::invoke
09:33:17,687 [mess-id-15] we don't use access rights, so allow this object
09:33:17,687 [mess-id-15] we don't use access rights, so allow this object
09:33:17,687 [mess-id-15] we don't use access rights, so allow this object
09:33:17,688 [mess-id-15] XSD validation file location
09:33:17,688 [mess-id-4] SUCCESS in query execution
09:33:17,688 [mess-id-4] response code from
09:33:17,688 [mess-id-4] committing database transaction
09:33:17,689 [mess-id-4] releasing database connection
09:33:17,689 [mess-id-4] outputResponse..start
09:33:17,689 [mess-id-4] outputResponse..end
09:33:17,689 [mess-id-4] Enter: LogHandler::invoke
09:33:17,689 [mess-id-4] Outgoing SOAP response:
09:33:17,689 [mess-id-15] <?xml version="1.0" encoding="UTF-8"?>
<ValidityCheck xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><OperationConnectionInfo></OperationConnectionInfo></ValidityCheck>
09:33:17,689 [mess-id-15] XMLReader to be used: org.apache.xerces.parsers.SAXParser
09:33:17,690 [mess-id-15] request validated against XSD in 1 ms
09:33:17,691 [mess-id-15] database connection status
09:33:17,692 [mess-id-4] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,692 [mess-id-4] Exit: LogHandler::invoke
09:33:17,694 [mess-id-15] setting
09:33:17,696 [mess-id-15] executing query
09:33:17,696 [mess-id-15] SUCCESS in query execution
09:33:17,696 [mess-id-15] response code from
09:33:17,696 [mess-id-15] committing database transaction
09:33:17,697 [mess-id-15] releasing database connection
09:33:17,697 [mess-id-15] outputResponse..start
09:33:17,697 [mess-id-15] outputResponse..end
09:33:17,697 [mess-id-15] Enter: LogHandler::invoke
09:33:17,697 [mess-id-15] Outgoing SOAP response:
09:33:17,697 [mess-id-10] SUCCESS in query execution
09:33:17,697 [mess-id-10] response code from
09:33:17,697 [mess-id-10] committing database transaction
09:33:17,698 [mess-id-10] releasing database connection
09:33:17,698 [mess-id-10] outputResponse..start
09:33:17,698 [mess-id-10] outputResponse..end
09:33:17,698 [mess-id-10] Enter: LogHandler::invoke
09:33:17,698 [mess-id-10] Outgoing SOAP response:
09:33:17,700 [mess-id-10] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,700 [mess-id-10] Exit: LogHandler::invoke
09:33:17,700 [mess-id-15] <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
09:33:17,700 [mess-id-15] Exit: LogHandler::invoke
>то скрипт нехило так память будет кушать
И? Ты олимпиадную задачку решаешь или работу делаешь?
С чего будет память?
Ты читаешь по строчке и в памяти хранишь только один набор за раз. Собрал полный, обработал и дальше пошел новый собирать.
Памяти как раз минимум.
Я посмотрю чуть позже.
>>28301
>>28302
Так, гуру регулярок, помощь всё ещё требуется.
Героическим гуглением я нашёл такое:
text = 'ûòåêcnbc okay r45 35 fhstr'
cleaned = re.sub(r'(?<!\S)[A-Za-z]+(?!\S)|(?<!\S)[A-Za-z]+(?=:(?!\S))', '', text).strip()
cleaned
'ûòåêcnbc r45 35'
но оно делает ровно наоборот - удаляет слова из чистой латиницы, а мне надо их оставить, а всё остальное убрать.
Как этот шаблон для такого поправить?
<a class="tm-article-title__link" href="/ru/post/491594/">Новый метод криптографии, обещающий идеальную секретность, встречен со скептицизмом</a>
Это элемент, который получился после прохода страницы с помощью BeautifulSoup.findAll, как оттуда вычленить текст url? Если проходиться по элементу итеративно, то он выбрасывает только content (ебучий текст про криптографию). Если еще раз пускать метод find, то не находит нихрена
Ты хуйню нашел. Оно ищет [A-Za-z]+ между пробельными символами.
Вот тот метод с коллбэком, что я говорил. https://ideone.com/xeiEIY
Ищутся все слова, а потом можно выбрасывать нинужные, в данном случае с цифрами.
Указываешь всё что тебе нужно, и вначале ^ для инвертирования, т.е. [^A-Za-z0-9] выкинет слова, в которых что-то кроме латинских букв и цифр.
Спасибо, вроде работает.
Алсо, тот кусок кода непременно надо в функцию repl выносить?
Или в одну строку re.sub(...) будет слишком громоздко?
Окей. Ещё раз спасибо.
>>29654
Лови, анон, я зделол тебе парсер. https://ideone.com/RXZNjF
Хоть побаловался чем-то сложнее однострочников, лол.
Надеюсь, разберешься.
Алсо, неужели нет никаких способов вносить изменения в файловые записи без посредника в виде временного файла? Сейчас, когда мне нужно, например, удалить из csv'шки N-ную строку, я просто перезаписываю в новый файл все строки, кроме N-ной, старый файл удаляю и новому присваиваю имя старого, и что-то я, погуглив, никаких альтернатив не нашёл, хотя выглядит этот метод каким-то совершенно идиотским.
Вернее, у меня даже не столько с точки зрения времени исполнения возникают вопросы (понятно, что с большими объёмами по-другому и не будет), сколько с точки зрения использования памяти. Как тут еnumerate себя показал бы?
Это генератор, он построчно читает по запросу.
Текстовые файлы имеет смысл редактировать построчно, потому что это дает минимальное потребление памяти.
В принципе, ты можешь дойти до нужного тебе места, считать остаток в буфер, урезать файл и дописать из буфера. Но нужен буфер, собственно.
Буфер - это всё равно какой-то временный файл, да?
Или ты имеешь в виду память? Просто большая csv'шка может и несколько гигабайт весить, не выгружать же это в память.
Ну да, поэтому так и получается. Надо выбирать подходящий варант для конкретной ситуации.
Понятно, спасибо.
Как вообще это работает обьясните кто ни будь, нашёл какие то деревянные сайты но там ничего нельзя кроме консоли
Двач, подскажи. Есть txt файл, в нем очень много слов. Нужно открыть его, прочитать слова и выбрать парами из них тех, которые являются анаграммами друг к другу. При этом в них 12 символов. В output должно быть два списка. Я сделал через проверку count по циклам, но не проходит по времени. Говорят, нужно юзать словари.
Хотя
met_second.insert(letters_sequences[word_letters], word)
мне не нравится, сломается. Лучше переделать. А хотелось красиво, эх.
https://ideone.com/CrSkSH
Вот так сработает. Но словари со списками в качестве значений выглядят страшненько. Не люблю их. Зато названий меньше.
Ах ты ж клята Йаба
>>29964
И я не до конца понимаю алгоритм. Мы читаем файл в список. Затем создаем новый список, в котором слова отсортированы по алфавиту. Потом идет условие: если слова нет в словаре, добавляем его в словарь? Точнее я совсем его не понимаю. Объясни для тупых плз. В какой момент мы ищем слово с таким же набором символов?
with open('test/anagr.txt', 'r') as f: #открываем файл
for word in f.read().split(): #берём слово
word_letters = ''.join(sorted(word)) #сортируем буквы в слове по алфавиту
if word_letters not in letters_sequences: #если такого набора букв нет в словаре
letters_sequences[word_letters] = [word] #добавляем набор букв в качестве ключа и список со словом в качестве значения
else: #если есть,
letters_sequences[word_letters].append(word) #то добавляем в список слов ещё одно слово
Ладно, ребзики, честно признаюсь - заебался. 215 страничек осилил (на иглише, лул). Сплошная вода. Нудно. Очень нудно. И много воды. И нудно.
Чаптер номер_чаптера. В Питоне есть такая-то хуйня-нейм. Бла-бла-бла. Эту хуйню-нейм мы рассмотрим позже. Бла-бла-бла. Прежде, чем читать дальше, запомните, что в Питоне есть такая-то хуйня-нейм, которую мы рассмотрим в следующем чаптере.
Чаптер номер_чаптера+1. Как мы узнали из предыдущего чаптера, в Питоне есть хуйня-нейм. Бла-бла-бла. О существовании хуйни-нейм мы узнали из предыдущего чаптера. Бла-бла-бла. Хуйня-нейм - это бла-бла-бла. Более подробно хуйню-нейм мы изучим позже в книге.
Quiz: Что есть в Питоне?
Answers: В Питоне есть хуйня-нейм.
Йибать. В пизду. Дропаю Лутца. Это ладно, полбеды, что за все 215 страничек единственное полезное, что я узнал - то, что в Python можно 2 в 1000000 степени посчитать. Беда в том, что, в тех редких случаях, когда Лутц начинает пояснять за хуйню-нейм - он ее поясняет для версий 2 и 3.3. В итоге, в голове сходу каша.
Серьезно. Не преувеличиваю.
Вступление. Ладно. Пес с ним. Краткую (на 20 страничек) историю можно почитать для общего развития.
Парт 1. Чаптеры 1, 2 и 3. Блять. 90 страничек размазывает, как командной строкой пользоваться. Вы меня извините, но если человек сел учить программирование - он должен знать, как пользоваться командной строкой и что у файлов, кроме имени есть расширение. Если не знает - пусть пиздует компом учиться пользоваться. Зачем на целых 90 страничек это размазывать? Хз.
Парт 2. Чаптер 4. Целых 40 страничек размазывает, о чем будем говорить в следующих чаптерах в этом парте.
Чаптер 5. Нумерик тайпс. Какие существуют числовые типы. Две странички воды. Операции, применимые к числовым типам. Две странички перекрестных ссылок. Еще три странички воды. Сравнение версий 2 и 3. Еще вода.
Не рикаминдую. Бестолковая книга.
>Читать книги по скриптовым языкам
Чего ты ожидал-то?
По классике идут 15% копипаста спецификации языка, 5% каких-то хитрых и не очень фишек и 80%+ маняопыта в нескучных проектах и конкретной отсебятины автора
Ты еще по жсу книги почитай
Его можно неторопливо почитывать после изучения из других источников и узнавать всякие интересные штуки, которые там не охвачены.
This, Лутц как контрольное напоминание пройденного не более
По скриптовым я три книги прочитал и они не были такими нудными, хотя там тоже по 1000+ страничек каждый:
Колин Мук, "ActionScript 3.0"
Котеров, "PHP 5"
Флэнаган, "JavaScript, 6-е издание"
У Колина Мука вообще ТОПовая книга. Сходу начинает программу писать и каждую новую фишку в этой программе толково и подробно объясняет. До Колина Мука в ООП не мог въехать. После него сразу въехал.
Котеров, фактически, мануал перепечатал. После книги еще мануал перечитал и не заметил разницы.
У Флэнаган максимум справочник. Минимум воды. Все по делу. Нудно да, но ни грамма левой бесполезной хуиты.
>>30288
>Его можно неторопливо почитывать после изучения из других источников и узнавать всякие интересные штуки, которые там не охвачены.
Я его читаю после Dive into Python (>>1604158 →). Никаких интересных штук у Лутца за первые 215 не увидел.
Анон, спасибо тебе огромное, даже не знаю как тебя отблагодарить. Выручил, ещё раз - Спасибо!
Не плотят. Погроммирую чисто чтобы поугорать.
В pip как то можно настроить зеркала? С дефолтных качает пиздец долго. Я пытался гуглить, как это сделать, но по первым ссылкам нихуя не понятно.
Как это работает? У библиотек ведь нет соединения с интернетом. Как они узнают что в будущем будут изменения?
> У библиотек ведь нет соединения с интернетом.
С чего ты взял? Вот в функции print(), например, только одна строчка занимается выводом на экран, а дальше ещё 200 строк с телеметрией, трекерами и аналитиками.
Я просто думал что один раз поставил через пип библиотеку и на этом всё. Только вручную проверять на наличие обновлений и обновлять при желании.
И еще отсюда вопрос. А в какой момент времени библиотека решает что ей нужно проверить обновления?
Как это блин происходит, не пойму.
Норкоман штоле?
В верси 0.0.1 пишут warning deprecated grob klabische pidor
в верси 0.0.2-0.0.10 оно так и остается, в версии 0.1.1 её просто убирают.
Значит нихера нет ни каких соединений с инетом! Просто перед убиранием, пишут предупреждение.
Гениально, Ватсон!
А это не опасно, оставлять девочек одних с такими большими питонами?
Понял, что не могу нормально вкатиться в Джаву из-за излишне большого члена. Мой Питон 21х15,5 см не может без смеха смотреть на бедняг-джавистов. Без обид
Пытаюсь вкатится в андроид на котлине после двух лет опыта на пистоне. Идет крайне туго, тяжело воспринимаю объемные куски кода на любых явно типизированных языках. Чувствую себя дауном.
print (a.translate(bytes.maketrans(b"abcd", b"d%#")))
Зря братишка, я сам люблю порой вечерком томик Лутца перед камином полистать. Под бокальчик хорошего вискарика - просто сказка. Дропнул на вступлении епта. С моей концентрацией я его до седых мудей буду читать. По совету анона начал Н. Седера посматривать.
Нет, в смысле не заменить, а чтобы изначально были значения байтовой строки из инпута . "abcd" и "d%#" только в качестве примера указал.
Дано целое число N (N>0). Найти квадрат данного числа, используя для его вычисления формулу N2 = 1 + 3 + 5 + 7 + … + (2N-1)
Код питона при инпуте = 3 выдает 4, бэйсик выдает 9, какого хуя вопрос......
Вообще тебя бы спас банальный print (i) в начале цикла. Не пренебрегай отладочной печатью, искать ошибки просто взглядом на код - удел опытных людей, которые говна поели
Смотря для чего.
Просто ты ниасилил
Все говорят, чтоб научиться погромировать, нужно код писать, но я хз что писать. Мб есть какие-нибудь сборники задач или типа того? Знаю про кодварс, но там как-то уныло, типа просто задачи не понятно для чего. Или это тоже норм?
Я бы вообще хотел ботов для мессенджеров делать или бекэнд, поэтому питон учу. Мне прост не нравится ничего связанное с деланием каких-либо графических интерфейсов, не хочу верстать там и стили подбирать
Ну это же не отменяет вопроса о том, что писать. Бот - это же просто как бы вид ввода-вывода информации.
>Знаю про кодварс, но там как-то уныло, типа просто задачи не понятно для чего
Ты научишься программировать только если будешь получать удовольствие от процесса. Примерно как от разгадывания судоку
Ну я вообще не начинаю даже. У меня всю жизнь такая проблема была в общем-то. Когда надо сделать "что-нибудь", то попадаю в полный ступор. За всю школу ни одного сочинения не написал, почти никогда не рисовал на рисовании ничего на "свободную тему". Сейчас вот, когда тян была, она тоже постоянно любила меня просить "рассказать что-нибудь", "подарить что-нибкдь" итд. Пиздец злило нереально. Никогда ничего не делал.
С помощью опции --find-links можно указывать откуда брать пакеты, это может быть сайт или даже папка на твоем компьютере.
https://pip.pypa.io/en/latest/reference/pip_install/#finding-packages
С помощью опции --proxy можно указывать прокси-сервер.
https://pip.pypa.io/en/latest/reference/pip/#general-options
Можно задать значения по умолчанию для всех опций всех команд pip в специальном конфигурационном файле. Свой такой файл может быть определен как для всей системы, так и для отдельных пользователей или даже отдельных виртуальных окружений.
https://pip.pypa.io/en/latest/user_guide/#config-file
Ага.
Нашёл такую штуку, если кому надо побаловаться:
https://gist.github.com/Ronald-TR/1bb452206b97b470a2b74942de984acf
Правда, рассчитывал, что жопу будет чётче видно.
Об этом не подумал. Спасибо.
Я один из тех кто её позавчера искал. Спасибо родственная душа.
Ты либо чувствуешь что хочешь и варианты сами приходят в голову, либо рационально выбираешь что делать, без каких либо явных на то ощущений, и учишься любить это дело. А обоих случаях ты так или иначе научишься понимать что тебе больше нравится.
Честно говоря если тебе уже около 20, то я бы посоветовал сходить к психологу, без шуток. Твой ступор в творческой деятельности (ака придумать подарок, историю, написать сочинение) выглядит как комплекс. Почти 100% тебе мешает стресс от какого-то необоснованного ощущения что у тебя ничего не получится или типа того.
Либо можешь сам разбираться с этой проблемой, но уйдет намного больше времени.
Да, уже давно хочу пойти. Да даже ходил года 2-3 назад. Но я тогда испугался, что не знаю, что говорить и убежал после двух приемов. Собственно мне и до сих пор не очень понятно. Ну вот скажу я ему, что не умею че-то придумывать, а он мне типа "ну и че ты от меня хочешь?". Мне кажется, что тащемта секретов-то тут и нет, просто берешь и придумываешь без задней мысли, какие ещё могут быть варианты? Я сам не могу сформулировать проблему.
Но тем не менее, сейчас хочу на вторую говноработу устроиться попробовать ещё раз к мозгоправу пойти, да. Собственно возможно они для того и нужны.
Сорян за оффтоп.
Бывает такое
Удовольствие от процесса? И какое-же там удовольствие?
А куки что?
Нельзя чтоб юзер зашел с прокси или впн и проебал все данные
Поэтому даннве надо сохранять на стороне клиента. Это больше задача для фронтенда, но можно ли в джанге это адекватно запилить?
Питон 3.6. Винда 10. Как это пофиксить? Очень нужно.
Exception:
Traceback (most recent call last):
File "c:\users\intant\appdata\local\programs\python\python36\lib\site-packages\pip-9.0.1-py3.6.egg\pip\compat\__init__.py", line 73, in console_to_str
return s.decode(sys.__stdout__.encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x88 in position 0: invalid start byte
В чем прекол?
Можешь плз накидать примеров говнокода из джанги?
Ну я и над функцией могу какой-нибудь декоратор захерячить.
Из очевидного, чем CBV могут быть прикольные - это если тебе надо вывести кучу однотипных объектов без заебов то ты не пишешь функцию а прям в urls.py хуячишь какой объект моделей выводить как вьюху. Но это ж такое, чисто писанину сокращает.
Я бы ебанул в WSL на всякий случай.
Учитывая, что питон - самый популярный язык, что на нём пишут топовые конторы, ожидал, что он во всем лучше пыхи, которую все гнобят.
Любой популярный код выглядит как говно. Из-за универсальности, оптимизаций и прочих хаков.
Не знаю, что ты там увидел в пхп.
Не поверю ни разу.
Достаточно посмотреть исходники тех же coreutils, чтоы увидеть, что вся читабельность шлется нахуй.
Что уж говорить про пхп, где поверху кучи легаси говна навешали недожабу.
Это у тебя какая-то деформация.
>Достаточно посмотреть исходники тех же coreutils, чтоы увидеть, что вся читабельность шлется нахуй.
Я об этом и говорю - сорцы питоновских либ и фреймворков невозможно читать.
>Что уж говорить про пхп, где поверху кучи легаси говна навешали недожабу.
Открывай сорцы Ларавель и читай преспокойно - все ясно и понятно, то же самое с Yii2. У Symfony ситуация похуже, так как есть часть легаси, но в целом все равно лучше, чем где-либо в питоне.
Посоветуйте материала по тестам. Хочу вкатится, понять что к чему и для чего нужно. Заранее спасибо, змеякi!
Ну так в чем проблема идти и дальше юзать ПХП? Нахуй тебе язык где один говнокод?
Доки по пайтестс неплохо подойдут.
Нужно постепенно увеличивать 0, если соответствующий ключ есть в словаре.
d = {'abc': 0,'def': 0,'ghi': 0,'jkl': 0}
Нужно сравнить два словаря. Не могу понять, как значение прибавить.
for key,value in c.items():
if key in d:
Я делаю поле модели Django, и мне нужно, что бы при обновлении, оно оставляло в себе в кое-какой форме все предыдущие значения поля. Беру сигнал pre_save. Насколько я понял, значение, которое приходит из сериализатора при обновлении, примерно getattr(model_instance, self.get_attname), а значение, которое лежало в поле до этого, в сигнале pre_save можно откопать примерно так - getattr(self.model.object.get(model_instance.id), self.get_attname), только у меня что то нихуя не выходит. Может кто-то чем то таким занимался, может подсказать?
Первая неделя испытательного, уже 2 дня не могу это сделать...
Ты уверен, что тебе .items() нужен, а не .keys()?
for ckey in c.keys():
if ckey in d.keys():
d[ckey] += 1
> d[ckey] += 1
Как вместо 1 задать значение ключа из словаря с? Чтобы не обновлялось, а именно суммировалось.
двочую
По-моему, уже везде сделали prepared statements. Пользуйся, ёпта.
Есть бот на python-telegram-bot, хочу продублировать функционал в вебе. На сколько я понимаю его запросы к бд можно перевести на рест который будет в жанге. Итого будет 2 исполняемых файла сам сервер жанги и бота для телеги? или как это делается у серьезных дяденек?
import random
import os
#send_random_picture
all_files_in_directory = os.listdir('path')
file = random.choice(all_files_in_directory)
doc = open('path' + '/' + file, 'rb')
#если нужно подпись к фото
caption = "любой текст"
#send_random_photo
bot.send_photo(chat_id, doc, caption)
выглядит вроде как то так, но я не сильно шарю, заранее спасибо.
Я конечно думал, что это очень примитивно и тупо, а посему должно сделано иначе.
"Рядом" - это реализация бота по средствам самой джанги?
Если тебе нужна 1 база данных для бота и веба, то это один джанго проект с 2 приложениями: bot и web-api
Можно оставить python-telegram-bot, просто делать запросы в базу с джанговской ORM
Ааа, получается как бы "startapp" с подобающим внесением приложения в структуру проекта?
Проще, конечно. Сначала я так и сделал. Хранил все в одном JSONField, а обновлял с помощью FieldTrackera, только теперь мне надо запихнуть это в границы поля.
Подкиньте сурс, где можно максимально информативно пройтись по жсу без воды и лишнего говна?
Как привязать ссаную таблицу sqlite к tableView в pyqt?
Делаю:
model = QtSql.QSqlTableModel()
model.setQuery("SELECT * FROM TABLE2")
model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
self.ui.tableView1.setModel(model)
self.ui.tableView1.show()
TypeError: setQuery(self, QSqlQuery): argument 1 has unexpected type 'str'
>Нужно что бы автоматически из нужной папки постил файлы в рандомном порядке с некоторым интервалом
Как сделать полноценный код, что бы все работало?
Ну вначале напиши код который будет читать файлы из папки(подсказка - listdir), затем функцию которая будет перемешивать уже готовый список из файлов(подсказка - random).
Затем бери библиотеку для пистоновского бота для тг и хуярь его по докам.
Что должен уметь скрипт:
Основное: переходить по ссылкам, последовательно заполнять данные на сайте, нажимать на кнопки и делать это по таймеру.
Дополнительно: уметь выполнять одновременно несколько процессов в разных окнах браузера, при этом в каждом использовать разные заране сохраненные данные.
Желательно: иметь поддержку прокси.
ваша цена
10 банок варенья, 20 пачек печенья, 1,5 кг халвы ореховой, а сгущённого молока – по двадцать четыре банки в сутки!
Инсулин докину сверху, просто от души
не выебывайся, сколько будет стоить
мальчиш плохиш пошел в веб дев
мильйон
300$
299$
Я хуй знает, у меня ЕОТова короче в декабре задрочила базовый уровень и в январе заработала 20 косарей на этих ботах, сейчас забила из-за ЕГЭ, я вообще охуел
Каждому!
наверное лучше выкатываться отсюда...
Первое - значение (или функция класса объекта или еще чет), а второе - template tag
Ок-с
И правда ли что писать много обработки данных в темплейтах - хуевый тон и значительное замедление страниц?
А ты много обработки в шаблон и не запихнешь, там не очень много функционала для этого. Раскрасить табличку "если парное - бекграунд белый, если непарное - бекграунд серый", еще какое-нибудь говно "если реквест.урл == инстанс.гет_фулл_юрл" да и все в принципе. Не ну есть способы выебать шаблонную систему джанги в рот, но такие способы это как дурак со стеклянным хуем - вроде и можно дать, да результат заранее понятен.
А так вообще хер знает, мне всегда важнее была скорость разработки, чем скорость работы. Откровенно тупящие вещи можно в кеш запихнуть какой.
Ну это все равно не такой пиздец как допустим нахуярить темплейт тег чтобы по рест апи жсон запрашивать где-то выплевывать массивом в шаблон и в шаблоне уже деребанить
Да и очевидно что так делать не стоит, того мне кажется такой велосипед городить далеко не каждый додумается, а если и нагородит - то скорее всего решит переделать
двадцать косарей долларов?
numbers = []
for i in numbers:
if (i / 3 or i / 5) and i < 1000:
numbers.append(i)
i += 1
return (i)
nu_chisla()
Почему, собственно говоря, не работает!?
нужно чтобы в список вносились числа кратные 3 и 5
>def nu_chisla():
>numbers = []
>while i < 1000:
>if (i / 3 or i / 5):
>numbers.append(i)
>i += 1
>return (i)
>nu_chisla()
Ты табы нееправильно расставил. У тебя i всегда равно 0, потому что увеличивается, только если оно делится на 3 или 5.
Я всегда в таких задачках чувствую себя хуем.
Решить-то решаю, но если посмотреть результаты каких-то дрочеров, то мое весьма уныло.
Думаю, оно как раз нарабатывается дрочением, так что такой себе скилл.
Если не въехали, вот о чем я: мы наследуемся от некого миксина и базового класса (который сука сам наследуется от других базовых классов и миксинов!), как в таком случае посмотреть исходный код со всеми методами и атрибутами получившегося класса? Это банально удобно
Без базара. Только я в Жабу не врубаюсь (на которой пичарм и нахуярен)
Хм, случайно не в курсе, можно ли в Джанго работать с куками и хранить там персональную инфу для каждого отдельного юзера? Или это прерогатива именно фронта?
Ну короткий ответ - можно, и даже нужно.
Но сам по себе механизм для данного функциона чутка изощреннее, чем просто куки. Гуглится по "сессии". Хранишь в куках (или еще каким-то нужным тебе способом) идентификатор сессии - а в сессии уже все остальное.
Если планируется логин-логаут юзеров + какая-нибудь например корзина - заморачиваешься с тем, чтобы присваивать вошедшему или вышедшему юзеру его предыдущий идентификатор сессии, чтобы ничего не проебалось из корзины.
Делается доволно просто, на стаковерфлоу точно есть кучка постов об этом
Вот оно, хвалёное наследование.
Пишу еа жабе и каждый раз в таких ситуациях проклинаю тех, кто его юзает.
>ряя аггрегация бьет наследование! наследование нинужно яскозал!
Ты хоть понимаешь в какое уг превратится исходный код, если тебе нужно запилить продвинутый и расширяемый функционал? Как в тех же CBV джанги? Наследование тут меньшее зло
n = input()
for i in range (len(n)):
if i%3==0:
n == ' '
print (n)
По итогу строка просто не меняется. Че я делаю не так?
Во-первых, строки нельзя модифицировать.
Во-вторых, ты пробуешь это сделать через проверку ==, лол.
В третьих, ты проверяешь на деление просто числа, а не значения строки.
Можно преобразовать строку в список, каждому третьему элементу присвоить "" и заджойнить обратно.
Вот решение в виде модного и непонятного однострочника:
"".join([c for i, c in enumerate(n) if i % 3])
Есть ли где-нибудь типа ТЗ или тестовые задания по созданию ботов? Ну или какие-нибудь просто задачи учебные, но только чтобы не рисовать какую-нибудь хуйню в графпай или черепахой. Хоть немного приближенное к реальности то есть, а не просто там нарисуйте N многоугольников друг в друге. Не могу сам себе ничего придумать.
В общем я ньюфаг в питоне. Написал давече скрипт для работы с API биржи. Хочу завернуть его в GUI оболочку. Но в гугле - всего пара видосов. Посоветуйте плиз литературку по работе с GUI фреймворками питона.
Тащемта, там всё довольно просто и однотипно с эвент лупом во всех тулкитах.
Единственное, что надо будет заморочиться, если захочешь сделать четенько без фризов гуя при блокирующих операциях.
Ну, речь была о апи, так что будут во время веб запросов как минимум.
Но это кому как, меня такая хуйня раздражает, кому-то может быть норм.
Бамп бля вопросу
Табы круто, когда ты понимаешь, что ты пишешь.
на локалке я запускаю его как docker-compose up.
Так вот вопрос. где (облако) можно хранить мой скрипт запущенный. что бы я не парился есть ли гайды готовые?
Наверняка есть какой-нибудь дешёвый говно-PaaS, где можно напрямую деплоить докер-образы.
ну я там попытался. так как у меня не просто скрипт. а еще rabbitmq в compose. такое ощущение что он берет ток докер файл. его монтирует. а на остальное болт кладет. =/
Ну и я нихрена не понял там...
Рамальо Лучано - Python. К вершинам мастерства - единственное что находил, где тебе не срут в голову элементарными вещами, а рассказывают какие-то тонкости языка и т.д.
Fluent Python by Luciano Ramalho, угу. В принципе, я на ней и планировал остановиться, её много хвалят в буржунетах.
плюсую
Для меня самая пиздатая книга по питону всех времен и народов - Think Python (есть на русском но хз как название ее перевели)
Написана не как для дебилов, заданий в конце глав много и они логичные, но захватывают чуть больше чем было в главе чтобы ты хоть чутка покопался в документации.
Чем особенно хороша - так это тем что охватывает практически весь ассортимент решаемых на питоне задач. Те прочитав одну книженцию ты будешь плюс-минус понимать куда и как использовать питон с прикладной точки зрения.
Из минусов - ненавижу, блядь, черепашек
Я очень жалею что Синк ЖС какого-нибудь есть потому что жс это ебать какое болото для меня
Кстати, вопрос в тему: что почитать питонисту-бэкендеру, чтоб скорее вьехать в жс?
number = 600851475143
i = 1
while i <= number:
if number%i==0:
list.append(i)
i += 1
print (list[-1])
да что не так......... почему оно не живёт
че сделать то хочешь?
совсем что ли больной блять, задачу не описал, код привел без форматирования, цифры блять аппенды, мы это как понимать должны ущербный?
Найти самый большой делитель числа 600851475143, без остатка
крч, если у тебя есть число N и ты его представляешь как произведение двух целых чисел N=a·b, то этих делителей будет четное (кроме квадратов) число и смотри почему. Вот число 100
100 = 2 · 50
100 = 4 · 25
а потом они местами меняются
100 = 25 · 4
100 = 50 · 2
То есть найти наибольший делитель == найти наименьший делитель
И можно список лишних не держать а перебирать с 2 до number-1 пока не встретишь первый делитель (пусть x), и тогда наибольший делитель это number//x
прикол: перебирать можно до sqrt(number) а не до number
корень можно не вычислять
если число не делится на 2, то на любое другое четное можно не делить (см число Эратосфена)
Спасибо, из тебя вышел бы отличный наставник
ты намешал все в кучу:
работать на нескольких процессорах заставить можно, собственно это и делает gunicorn. Руками можно использовать модуль стандартной библиотеки multiprocessing.
Если тебе нужен фоновый процесс, то это тоже можно сделать используя плагины django (сам не django не пишу не могу подсказать, но слышал про django background tasks).
То что ты написал, лучше решать запустив это как отдельный сервис, то есть у тебя одно питон приложение сервер, одно вот твой ебучий отправлятель сторонним ресурсам, одно бд.
До sqrt перебирать не желательно, а почти обязательно. Иначе любую тестовую задачу завалишь.
Можно оптимизировать сильно, хотя может и не нужно.
вот пример частично оптимизированного решения
https://ideone.com/5khiN0
Такое решение пройдёт какие-то тесты, которое не пройдёт решение с тупым перебором до корня.
Несколько процессов django запустить не сложно, нужен менеждер задач для этого (гуникорн, супервизор или ещё что-нибудь).
Для того, что хочешь ты, Джанго исходно не очень предназначен, это асинхронные задачи. Хотя делают. Смотреть надо на всякие celery и смежные решения. Вместо фласка можно смотреть на aiohttp.
Это самый большой простой делитель. Если вообще нужен, а не простой, надо чуть модифицировать. Надо найти самый меньший простой, и потом просто число number подедить на него.
если честно ты какую-то хуйню спизданул, вообще не понял что ты в своем коде оптимизировал? ты ищешь самый большой простой делитель? нахуя?
int(number0.5) ? зачем?
if current_p_max <= 2 and number % 2 == 0:
return get_p_max(number//2, 2)
что?
Пока что нагуглил что нужно использовать streams из asyncio, и поднимать свой TCP-сервер, но пока не разобрался как с этим работать.
Сокет обычный. https://docs.python.org/3/library/socket.html#example
Можешь на том же хттп потренироваться без всяких либ хттпшных.
Ещё struct может пригодиться для работы с всякими форматами.
https://docs.python.org/3.8/library/struct.html
Да, просто завернули в эту вашу асинхронность.
Когда шапку в божеский вид приведете? Уже сто лет в обед, а так ничего не поменяли: "Вот вам литература, тут код постите и вот вам протухшие ссылки на Чаво 5тилетней давности - ебитесь как хотите".
Может уже пора переписать шапку, чтоб нормально можно было и любому ньюфагу и шарящему можно было вкатиться по нормальному, а не копошиться в протухших ссылках и куче литературы, не понимая с чего начинать?
Когда ты сам перекатишь и внесёшь нужные правки вместо строчения постов, которые всё равно все забудут.
Код, который выполняется при создании нового объекта.
Можно передать ему какие-то параметры или инициализировать какие-то значения в объекте.
А называется это конструктором.
Да я, другой анон, не поленюсь и с поправками перекачу, если ещё какой-нибудь анон что-нибудь нормально составит.
Я сто лет не нюфаг и просто в литературе не ориентируюсь. Давно не заглядывал, кроме как в доки, мне тупо сложно посоветовать.
И разных нюфагов много. Одни ни бум-бум в программировали, другие чуть-чуть что-то слышали, ещё кто-то прилично программировал уже и понимает, как языки устроены. Всем своя литература нужна.
Асинхронность нужна тогда, когда тебе надо несколько задач одновременно обслуживать, например слушать несколько сокетов. Тогда или асинхронность в asyncio, или треды, или велосипеды на базе select.
Если только один сокет слушать, то не нужен этот asyncio.
монго. редис.
Слушай, мб у тебя есть почта, я бы иногда задавал вопросы..
Пока копаю в ручном получении значения cookie cf_clearance для wget
Почему я не могу сделать a.reverse()?
Выскакивает "None"
Нашел решение вместо a.reverse() сделать a[::-1] но всё равно непонятно для чего реверс
С первой страницы гугла по запросу cloudflare bypass python - https://github.com/VeNoMouS/cloudscraper
он же какой-то пиздос тормознутый...
some.isSome().all()
как это работает, как такое напиcать?
нуфаг
Ну хз, я питонист-линуксоид все устраивает. Ошибок и нет особо
Собственно, имеется файл, в который я хочу записывать данные в формате {1 : ["a","b","c"], 2 : ["d","e","f"]...} и так далее. Записать у меня получилось, но суть что я хочу этот список переодически обновлять и дополнять, поэтому накодил пикрелейтед (который кстати спокойно работает с форматом без списка), но почему-то в данном случае вылетает ошибка при вызове json.load()
>json.decoder.JSONDecodeError: Extra data: line 1 column 312 (char 311)
которая указывает на ]} в конце записи.
ЧЯДНТ и как это пофиксить?
Сокеты в питоне ну совсем элементарные.
import socket
sock = socket.socket()
sock.bind(("localhost", 1488))
sock.listen(N)
client_sock, client_addr = sock.accept()
# дальше либо создавать по треду на каждого клиента
# либо юзать select.select()
# либо ёбнуть asyncio-шный run_in_executor
В доке asyncio streams
и стало интересно, это ирл в больших проектах как-то используется? особенно учитывая, что самому пистону в принципе поебать, какие ты там подписал типы в функциях
Все в твоем классе?
IDE или линтер бухтит в процесс разработки, больше никак.
питон разработчик 5 лет
сами аннотации используются довольно активно, т.к. есть линтеры, которые это дело чекают, что позволяет отсекать всякие совсем уж дурные описки
Но бывают ребята которые код не пишут, а хуярят, против них тоже помогает
Гугли: mypy, flake8
В случае некоторой неудачи в коде делаю следующую попытку, перед следующей попыткой делаю ожидание (к примеру 20 секунд), множу время ожидания на попытки 1, 2, 3, 4 и т. д., только с четвёртой, пятой попытки ожидание нарастает уж очень сильно, 8, 40, 200 минут. Может кто подсказать как сделать более плавное нарастающее ожидание между попытками?
Со сложениями тоже хуйня какая-то не плавная.
обычно, если не хотят заддосить запросами, то делает что-то вроде того:
первые 5-10 запросов повторяют запросы часто (раз в 1 секунду)
следующие запросы уже делают редко (раз в 20 минут например)
Особого смысла наращивать 1с 10с 20с 30с 40с 50с 60с 2мин 3 мин нет, хоть мб это и красиво выглядит
> если не хотят заддосить запросами
> С чего ты взял что мне что-то дудосить надо
?
говорю тебе первые десять запросов делай с небольшим перерывом между ними, а все следующие с большим, так будет просто проще, не придумывай математику на ровном месте
>первые 5-10 запросов повторяют запросы часто (раз в 1 секунду)
Если бы я занимался дудосами, то я бы так и делал, но я ими не занимаюсь и такая частая хуйня мне не нужна
>1с 10с 20с 30с 40с 50с 60с
Даже это для меня слишком часто
Да ты даун что-ли? Нахуй ты мне советуешь делать что-то не зная что я делаю и когда я говорю что мне это нахуй не надо?
>> не может объяснить что ему нужно
3 раза уже писал, плавное наращивание времени ожидания, а не наоборот как мне тут говоришь делать ты.
>> все вокруг дауны
Нет, я только про тебя писал, ни про кого больше, другой >>36940 мне сразу скинул math.sqrt, правда надо подумать как это применить так как мне надо.
Адекватно ли использовать строки как ключ в словаре или так только быдло делает?
Найти наибольший общий делитель и поделить ширину и высоту на него.
>Да
Что за туториал/доки смотреть? Мне надо сделать очередь из объектов, которые вытащат из реляционной бд
Зачем нужен декоратор @staticmethod? Stackabuse прочитал, доки прочитал, не понял глубинной сути. Что такого он позволяет делать, чего не позволяет делать любая другая функция?
Чтобы оставаться в составе класса, т.к. имеет к нему отношение.
Это обычно какие-то вспомогательные функции вроде математики, эскейпинга и т.д.
Запусти пример и сразу увидишь разницу.
class MyClass:
__@staticmethod
__def foo(args):
____print(args)
__def bar(args):
____print(args)
MyClass.foo(1, 2, 3)
MyClass.bar(1, 2, 3)
my_object = MyClass()
my_object.foo(1, 2, 3)
my_object.bar(1, 2, 3)
> Это плохой стиль по сравнению со staticmethod?
Это процедурный подход. Если у тебя ооп, то плохой, лол.
Вызванная у экземпляра - да. А со staticmethod - обязательно нет.
В общем, чтобы не ошибиться, всегда вызывай статики только у классов, а не-статики - только у экземпляров.
Допустим, у нас есть массив чисел
s = [3, 2, 1, 7, 8, 1, 9, 5, 4]
Каким образом можно вывести все числа, находящиеся между единицами?
В гугле посмотрел про регулярные выражения, но чет почти ничего не понял(
Ну тогда очевидно-правильным решением будет достать все индексы единичек через компрехеншеш, а потом доставать их парами и брать слайсы.
Получить список индексов с единицами, а дальше срезы хуле
https://pastebin.com/HKDXC2Sf
Как получить значение атрибута href?
element.attrs['html']
не находят ключ
Ещё один вопрос, ищу элемент
comment = soup.findAll('div', {'id': 'comments'})
получаю bs4.element.resultset
как потом в нём сделать поиск по ('div', class_='content')?
Пишу чатбота для втентакля модуль vk_api, столкнулся с проблемой, что по ночам скрипт падает при простое со следующими ошибками:
https://pastebin.com/E3BZDuDa
Код скрипта: https://pastebin.com/p6BCjKGc
Раньше бот падал от requests.exceptions.ReadTimeout каждые 10 минут бездействия, я обернул цикл прослушивания в try/except и вроде помогло, а теперь он в один момент по какой-то причине не смог установить соединение, как я понял.
Как можно пофиксить?
Как в питоне запилить такую фичу: предположим у нас есть класс PidorBot. Мы его инициализируем, он работает с АПИ какой-то системы. Но описывать методами каждую залупу в АПИ слишком напряжно, а делать это через PidorBot.call("api_name", "args") слишком некрасиво.
Можно ли сделать так, что к PidorBot можно присобачивать имя метода, например: PidorBot.call("arg1", "arg2"), а сам класс просто перехватывал имя метода с аргументами и оборачивал в запрос.
Надеюсь ясно выразился.
ридин компрехенсьён
Ты алгоритм не понимаешь или как написать?
Берешь "окно" размером 13 и гонишь по всему числу, ища произведение
на Питоне заниматься числодробильней - идея на миллион
def collatz(a):
if a%2==0:
return a//2
else:
return 3*a+1
d = int(input('Enter num: '))
print(collatz(d))
Traceback (most recent call last):
File "pandatest.py", line 2, in <module>
import pandapower
File "/home/user/.local/lib/python2.7/site-packages/pandapower/__init__.py", line 6, in <module>
from pandapower.auxiliary import *
File "/home/user/.local/lib/python2.7/site-packages/pandapower/auxiliary.py", line 31, in <module>
from collections.abc import MutableMapping
ImportError: No module named abc
Пытаюсь подключить библиотеку, написал в терминале pip install pyautogui в итоге эррор 1, в чём может быть проблема?https://github.com/asweigart/pyautogui
Зачем вообще использовать второй питон в 2020?
Окей, спасибо
СПАСИБО, БРАТАН
Каких блять зависимостей? Нахера они громадный модуль запихали внутрь другого громадного модуля? Смотрится по-уебски. numpy и так можно вызывать
Можете пояснить, что этот код делает? Я не понимаю, зачем там рандом и как обрабатывается входное значение через pe
Хотя я, кажется, понял, мы берем и создаем рандомный тензор и берем 36 элементов из него и складываем.
Ну точнее не 36, а столько, сколько указано в x.size(1)
ты можешь передать содержимое второго списка, вместо того, чтобы ссылаться на него
>>lst1 = lst2[::]
прочитай книжку AByteOfPython, там все хорошо описывается вместе со всеми тонкостями
Ссылка на вопрос https://ru.stackoverflow.com/questions/1116274/Как-узнать-на-какой-именно-график-нажал-пользователь
Еще интересует компиляция в .exe, сделал через pypinstaller, локально всё работает, хорошо. Но проблема в том, что у пользователя который будет инсталлировать .exe не будет установлены пакеты Python 3.8. Я так понимаю нужно в ручную писать инсталятор для этого дела, если так, то опять таки в какую сторону мне этот вопрос начать изучать?
И также после инсталяции хочу .exe поместить в автозагрузку. Либа win32api для этого подойдет?
Ошибочки - эт хорошо. Тем более в Питоне - они показывают суть проблемы, ты ещё не видел таких информативных ошибок, как здесь.
Да и сообщество на разных сайтах хорошо поясняет их
Это копия, сохраненная 31 мая 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.