Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 24, 2017 02:50:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

Serggg
Поменял в строке
Serggg
filename на нужный мне префикс, который по идее должен браться из 1ой строчки файла 1.txt.
Не надо ничего менять, определись с именами файлов. Просто перечитай этот топик и посмотри, сколько разных имён файлов ты описал здесь. Они у тебя уже менялись 100500 раз и дальше они точно так же будут меняться.

Serggg
что жестко заданный префикс файлов мешает всему процессу
Он потому и зашит, чтобы точно соответствовать требованиям, указанным в посте .

Serggg
Со списком файлов всё просто. Есть три группы по 6 в каждой. Префикс у всех одинаковый.

filename_1_1.xsh
filename_1_2.xsh
filename_1_3.xsh
filename_1_m.xsh

filename_2_1.xsh
filename_2_2.xsh
filename_2_3.xsh
filename_2_m.xsh

filename_n_m.xsh
n = 3 , m = 6.

Точно так же сначала нужно определить все возможные имена и только потом писать код, который их обрабатывает.

А ты пока что пишешь “сегодня у меня одно, вчера у меня другое, послезавтра третье, а через месяц четвёртое”. Проблема не в том, что там что-то зашито, проблема в том, что ты не понимаешь, что ты делаешь. Поэтому я тебе и говорю: разберись сначала с именами (какие они могут быть, как они могут быть упорядочены, какие там префиксы могут быть). Как разберёшься (ясная картинка появится), тогда и можно будет из той функции отращивать алгоритм для генерации упорядоченной последовательности имён.



Отредактировано py.user.next (Апрель 24, 2017 02:53:22)

Офлайн

#2 Апрель 25, 2017 10:37:40

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

Привет! Тоже изучаю python и django.
Serggg
Представляю, если программист так формулирует задание, что тогда ждать от заказчика.

py.user.next
Ну вот ‘простая’ типа задача, а как напрягла). Меня точно. Посмотрел код в таре, понравились 2 решения, которые сохранил для себя. Но вообще, читая код было ощущение, что расшифровываю тайное послание) По-моему, избыточное число ф-ций и странное их применение, что вызвало трудность прочтения. Возможно, это только у меня(. Назначение ф-ций, для меня, это избавиться от дублирования кода и повторное использование в других проектах. Возможно, есть еще какой-то другой смысл использования такого числа ф-ций, но не для будущей модификации. Думаю после того, как скрипт написан и он выполняет задуманное - он готов. Если от него потребовалось что-то новое, то это уже скрипт 2.0 , и он к 1.0 не имеет ни какого отношения, разве что исторически.

По коду.
Зачем эти m, n? Если ip строго привязан к названию файла, тогда нужно сделать файл соответствия с содержимым:
file_1 ip_1

file_n ip_n
Если нет, то достаточно простой раздачи.
Кстати, сейчас при увеличении или уменьшении n , m произойдет смещение соответствия ip адресов. Это устраивает?
Добавлю код, чтобы было что по пинать)

 import os
f_ctrl='1.txt'
dirpath='.'
with open(f_ctrl) as fctrl:
  addresses=list(map(str.strip, fctrl))
username=addresses.pop(0)
addresses_iterator = iter(addresses)
files=sorted(filter(lambda x:x.endswith('.xsh'), os.listdir(dirpath)))
for f in files:
  with open(f) as fin:
    data=fin.read()
  new_file=[]
  for line in data.split('\n'):
    if 'Host=' in line:
      new_file.append('Host=%s' % next(addresses_iterator))
    elif 'UserName=' in line:
      new_file.append('UserName=%s' % username)
    else:
      new_file.append(line)
  with open(f,'w') as fout:
    fout.write('\n'.join(new_file))
P.S. Кнопка ‘Code’ у меня не работает, пришлось в ручную добавлять теги). У всех так?

Отредактировано Vladimirv (Апрель 25, 2017 10:52:28)

Офлайн

#3 Апрель 25, 2017 11:42:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

Vladimirv
py.user.next
Ну вот ‘простая’ типа задача, а как напрягла).
Я её решал минут пять или десять даже (с проверкой, что всё работает).

Применена разработка “сверху вниз” - сначала пишется верхушка, потом ты от неё спускаешься всё ниже и ниже, пока не дойдёшь до дна. Пример ещё один здесь , задача посложнее. Можешь, конечно, написать монолитный код, он даже короче получится (хотя он у тебя вообще не получится, потому что сломается всё на середине ещё). Но вот пройдёт неделя, за неделю ты напишешь ещё пару таких кодов и через неделю вдруг выяснится, что в первом коде ошибка. А ты его уже не то что не помнишь, ты даже не помнишь, что вообще его писал. Что там про что там внутри, ты не помнишь и не знаешь, надо всё перечитывать, чтобы хотя бы понять, что там делается. Как ты его исправлять собрался, если баг где-нибудь в середине? ведь это повлияет на то, что после середины идёт - то есть тебе нужно ещё будет половину программы переделывать (а ты её не помнишь уже и данные у тебя не приготовлены для проверок всяких).

А мне вот не надо помнить ничего. Мне сказали, допустим, ошибка там-то, я пошёл, скачал эту программу, открыл её, прочитал заголовки функций, понял, что делает программа, потом пошёл в нужную функцию, прочитал её за пять минут, понял где в ней ошибка, исправил её в этой функции и всё - программа работает правильно. Мне не надо ничего переписывать, перепроверять по сто раз, всё работает.

Вот он сейчас говорит “мне надо сортировку имён переделать”, я ему говорю “сортировка имён в такой-то функции”, надо просто взять содержимое функции и переписать его на нужную сортировку и всё будет работать.

А у тебя возьмём код, вот он заменит в строке
Trampampam:jimbo huimbo Host=X Node=Y
из-за “Host=” всю строку на какую-то лажу якобы правильную. Почему? Потому что у тебя слабая проверка. Ну, ты наскоряк написал, потому что регулярку сложно писать, да и не помещается она там, неудобная короче, и в результате из-за удобства ты раз и потерял нить, и программа неправильно работает. А когда мы об этом узнаем? А через месяц, когда она испортит какой-то файл, который вылезет уже при коммуникации по этому файлу. Помнишь да, когда ракета упала, а почему, а потому что кто-то поставил какой-то датчик вверх ногами. А когда он поставил? Да хрен его знает, за несколько месяцев до этого. Так же и здесь, одна неточность и у каких-нибудь админов всё полетит.

И вот пришло время что-то исправлять. Как ты поймёшь что ошибка исправлена?

Vladimirv
 files=sorted(filter(lambda x:x.endswith('.xsh'), os.listdir(dirpath)))
Вот в этом месте в директории оказалась поддиректория abracadabra.xsh, какие твои действия в таком случае?



Отредактировано py.user.next (Апрель 25, 2017 11:45:39)

Офлайн

#4 Апрель 25, 2017 12:56:36

Serggg
Зарегистрирован: 2017-04-06
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

Согласен, что в первом сообщение не был определен префикс файлов, а написано было filename. Тогда это было сделано для простоты. Сейчас когда всё великолепно отрабатывает, заменяя и юзернейм и айпи адреса, настало время доработать программу до состояния конфетки. Если вы соизволите конечно. Я и так занял довольно много вашего несомненно ценного времени.

Итак, префикс файлов определяется точно так же как и в случае с юзернеймом - в первой строчке файла 1.txt. Сейчас я вручную в коде правлю на нужное мне и всё работает. И прошу помочь поправить код так, чтобы в случае если структура файлов будет 1.xsh - 2.xsh - 50.xsh , скрипт так же будет править верно айпи. Может сделать просто при запуске запрос от пользователя - “какая структура файлов будет использована: 1. filename_n_m.xsh или 2. Прямой перебор (1.xsh - 50.xsh)”.
Всем кто помогает, поставил плюс в репу))) Большое вам спасибо

Офлайн

#5 Апрель 25, 2017 12:58:43

Serggg
Зарегистрирован: 2017-04-06
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

По коду.
Зачем эти m, n? Если ip строго привязан к названию файла, тогда нужно сделать файл соответствия с содержимым:
file_1 ip_1

file_n ip_n
Если нет, то достаточно простой раздачи.
Кстати, сейчас при увеличении или уменьшении n , m произойдет смещение соответствия ip адресов. Это устраивает?

Нету соответствия айпи, это не принципиально. Главное чтобы каждый вписанный в файл 1.txt айпи адрес был записан в файл.

Офлайн

#6 Апрель 25, 2017 14:23:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

Serggg
И прошу помочь поправить код так, чтобы в случае если структура файлов будет 1.xsh - 2.xsh - 50.xsh , скрипт так же будет править верно айпи.
Просто замени функцию
  
def get_replace_file_names(dirpath):
    fname_patc = re.compile(r'.+\.xsh$')
    file_names = filter(fname_patc.search, os.listdir(dirpath))
    out = sorted(file_names,
                 key=lambda i: list(map(int, re.findall(r'\d+', i))))
    return out



Отредактировано py.user.next (Апрель 25, 2017 14:23:28)

Офлайн

#7 Апрель 25, 2017 15:29:37

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

Не знаю откуда эта задача, но похожа она на сисадминскую. Обслуживать скрипт это его работа, а все варианты не предусмотреть и надо ли это? Скрипт не оправдано раздуется.

Написанный скрипт, твой/мой не предполагает, что мы ими будем пользоваться))) И ты точно сказал, что он был просто набросан и выложен с целью показать как я это вижу. Сейчас он работает, в так сказать, в идеальных условиях, кстати как и твой.

Например, наши скрипты не предусматривают, что может не хватить ip на число файлов, а может быть и наоборот, и не известно что хуже(второе хуже). А скрипт-то точно должен предупредить об этом. Другой вариант, что если скрипт запускается из другой директории или вообще по крону? Они просто не работают) И ракета не упала)

Так что нужно снизить градус претензий и остановиться на развеселой беседе) Или сделай все предусматривающий вариант) Кстати, вслушайся как это звучит: ‘все предусматривающий’. Просто веет реализмом.

py.user.next
с проверкой, что всё работает
Что значит ‘с проверкой’?

Офлайн

#8 Апрель 25, 2017 16:50:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

Vladimirv
Сейчас он работает, в так сказать, в идеальных условиях, кстати как и твой.
Не, ты сказал, что у меня слишком много функций. Потом ты ещё сказал, что если скрипт надо поменять, то надо писать новый скрипт версии 2.0. Вот мне не надо ничего заново писать, я ему функцию заменил и теперь у него всё работает. Ты же нифига не заменил у себя в скрипте и он продолжает пропускать неправильные строки. И ты говоришь отмазку “он был просто набросан и выложен с целью показать как я это вижу”. Вот он сейчас скажет “а мне их надо менять умнее, чем просто заменять строки по началу”, вот ты что будешь делать? Ты будешь писать новый скрипт, а я просто заменю функции замен. Ты со своими этими короткими кодами будешь в итоге работать больше, чем я с одной змеёй сегментной.

Vladimirv
Например, наши скрипты не предусматривают, что может не хватить ip на число файлов
Да, но ты предусматривальщик не вставишь, тебе некуда вставлять, там уже без бутылки не разберёшься, а ты ещё сильнее код разнесёшь. А у меня достаточно добавить функцию предусматривания и больше ничего трогать не надо, всё ясно остаётся. У меня он открыт ко всем этим изменениям, а у тебя с каждым изменением (которого ты ещё ни одного не сделал, но у scidam'а это было видно, как они влияют) всё больше и больше это превращается в жопу. И в результате ты начинаешь не улучшать программу, а двигать её к тупику и последующему выбрасыванию и написанию всего заново. Это сейчас у тебя десять строк в коде, их ещё можно заново написать. Но когда она разрастётся, то 1000 строк уже так просто не выкинешь, уже жалко потраченное время, уже так просто не напишешь заново их.

Vladimirv
Другой вариант, что если скрипт запускается из другой директории или вообще по крону?
А ты думаешь, нафига я эту точку вывел там? Я мог бы её и вписать или вообще запустить os.listdir() с пустотой. Для того она и выведена, чтобы дальше его разрабатывать. Просто это может не понадобиться, поэтому это сразу и не сделано, просто выведено и приготовлено.

Vladimirv
Или сделай все предусматривающий вариант)
Открытый для изменений он должен быть. А у тебя с каждой строчкой всё больше и больше проблем. Ты просто пару изменений внесёшь и всё, от первоначальной программы ничего не останется, и ты будешь сидеть и сам свою программу не понимать. Это было у scidam'а, смотри вон у него всё поехало , это типичная история. Сначала ты пишешь вроде красивенький код, а потом надо что-то поменять и всё, от этого красивенького кода ничего не остаётся, получается какая-то запутанная фигня, в которой уже ничего не понятно.

Vladimirv
Что значит ‘с проверкой’?
То, что ты написал, работает так, как ты и хотел. То есть это делается окружение и на нём запускается скрипт, а потом смотрится, всё ли правильно изменилось. Потому что может получиться так, что ты ждёшь определённое поведение и видишь его в коде, а по факту оно ведёт себя совсем по-другому. На проверку уходит столько же времени (и даже больше), чем на написание кода. То есть если ты написал код, то ты обязательно должен его запустить, иначе ты можешь пропереться, выложив теоретически работающий код, который не работает.



Отредактировано py.user.next (Апрель 25, 2017 17:01:40)

Офлайн

#9 Апрель 25, 2017 17:23:10

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

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

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

Офлайн

#10 Апрель 25, 2017 17:47:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Прошу помощи. Супер сложное задание!

Vladimirv
Блин я то думал, что под тестированием подразумевалась какая-то хитроумная процедура, а тут просто запуск программы. Типа я этого не делал.

Ну вот я добавил в один из файлов второй строкой
abc Host= def

И вот что выдал твой скрипт
[guest@localhost repuser]$ ./repuser2.py 
Traceback (most recent call last):
File "./repuser2.py", line 18, in <module>
new_file.append('Host=%s' % next(addresses_iterator))
StopIteration
[guest@localhost repuser]$
Где ошибка, в каком файле, в чём именно ошибка? Ничего не пишет, сиди догадывайся.

То есть без хитроумных процедур твой скрипт сломался на вполне легальных данных. Нигде он не писал, что “Host=” не может быть в середине строки.

А мой что выдал
[guest@localhost repuser]$ ./repuser.py 
Ok
[guest@localhost repuser]$
и всё правильно поменял.

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

Vladimirv
Задачи надо решать по мере поступления, а запилка 1000 и 1 функции, так говоря на всякий случай, в мои планы не входит. Если что изменится, тогда и будем посмотреть) Так говоря, не собираюсь бежать впереди паровоза.
А ты думаешь, я бежал? :D Не смеши мои тапки, там ещё есть что сделать для минимума, просто ему оно нафиг не нужно, эти файлы он будет менять в ближайшее время, а потом выкинет скрипт. А вот той девчонке (что выше приводил) я сделал по полной, потому что явно для работы ей надо, без этого она руками сделать всё не сможет.



Отредактировано py.user.next (Апрель 25, 2017 17:59:18)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version