Форум сайта python.su
857
Serggg
Поменял в строке
SergggНе надо ничего менять, определись с именами файлов. Просто перечитай этот топик и посмотри, сколько разных имён файлов ты описал здесь. Они у тебя уже менялись 100500 раз и дальше они точно так же будут меняться.
filename на нужный мне префикс, который по идее должен браться из 1ой строчки файла 1.txt.
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)
Офлайн
7
Привет! Тоже изучаю 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))
Отредактировано Vladimirv (Апрель 25, 2017 10:52:28)
Офлайн
857
VladimirvЯ её решал минут пять или десять даже (с проверкой, что всё работает).
py.user.next
Ну вот ‘простая’ типа задача, а как напрягла).
Trampampam:jimbo huimbo Host=X Node=Y
VladimirvВот в этом месте в директории оказалась поддиректория abracadabra.xsh, какие твои действия в таком случае?files=sorted(filter(lambda x:x.endswith('.xsh'), os.listdir(dirpath)))
Отредактировано py.user.next (Апрель 25, 2017 11:45:39)
Офлайн
0
Согласен, что в первом сообщение не был определен префикс файлов, а написано было filename. Тогда это было сделано для простоты. Сейчас когда всё великолепно отрабатывает, заменяя и юзернейм и айпи адреса, настало время доработать программу до состояния конфетки. Если вы соизволите конечно. Я и так занял довольно много вашего несомненно ценного времени.
Итак, префикс файлов определяется точно так же как и в случае с юзернеймом - в первой строчке файла 1.txt. Сейчас я вручную в коде правлю на нужное мне и всё работает. И прошу помочь поправить код так, чтобы в случае если структура файлов будет 1.xsh - 2.xsh - 50.xsh , скрипт так же будет править верно айпи. Может сделать просто при запуске запрос от пользователя - “какая структура файлов будет использована: 1. filename_n_m.xsh или 2. Прямой перебор (1.xsh - 50.xsh)”.
Всем кто помогает, поставил плюс в репу))) Большое вам спасибо
Офлайн
0
По коду.
Зачем эти m, n? Если ip строго привязан к названию файла, тогда нужно сделать файл соответствия с содержимым:
file_1 ip_1
…
file_n ip_n
Если нет, то достаточно простой раздачи.
Кстати, сейчас при увеличении или уменьшении n , m произойдет смещение соответствия ip адресов. Это устраивает?
Офлайн
857
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
Не знаю откуда эта задача, но похожа она на сисадминскую. Обслуживать скрипт это его работа, а все варианты не предусмотреть и надо ли это? Скрипт не оправдано раздуется.
Написанный скрипт, твой/мой не предполагает, что мы ими будем пользоваться))) И ты точно сказал, что он был просто набросан и выложен с целью показать как я это вижу. Сейчас он работает, в так сказать, в идеальных условиях, кстати как и твой.
Например, наши скрипты не предусматривают, что может не хватить ip на число файлов, а может быть и наоборот, и не известно что хуже(второе хуже). А скрипт-то точно должен предупредить об этом. Другой вариант, что если скрипт запускается из другой директории или вообще по крону? Они просто не работают) И ракета не упала)
Так что нужно снизить градус претензий и остановиться на развеселой беседе) Или сделай все предусматривающий вариант) Кстати, вслушайся как это звучит: ‘все предусматривающий’. Просто веет реализмом.
py.user.nextЧто значит ‘с проверкой’?
с проверкой, что всё работает
Офлайн
857
VladimirvНе, ты сказал, что у меня слишком много функций. Потом ты ещё сказал, что если скрипт надо поменять, то надо писать новый скрипт версии 2.0. Вот мне не надо ничего заново писать, я ему функцию заменил и теперь у него всё работает. Ты же нифига не заменил у себя в скрипте и он продолжает пропускать неправильные строки. И ты говоришь отмазку “он был просто набросан и выложен с целью показать как я это вижу”. Вот он сейчас скажет “а мне их надо менять умнее, чем просто заменять строки по началу”, вот ты что будешь делать? Ты будешь писать новый скрипт, а я просто заменю функции замен. Ты со своими этими короткими кодами будешь в итоге работать больше, чем я с одной змеёй сегментной.
Сейчас он работает, в так сказать, в идеальных условиях, кстати как и твой.
VladimirvДа, но ты предусматривальщик не вставишь, тебе некуда вставлять, там уже без бутылки не разберёшься, а ты ещё сильнее код разнесёшь. А у меня достаточно добавить функцию предусматривания и больше ничего трогать не надо, всё ясно остаётся. У меня он открыт ко всем этим изменениям, а у тебя с каждым изменением (которого ты ещё ни одного не сделал, но у scidam'а это было видно, как они влияют) всё больше и больше это превращается в жопу. И в результате ты начинаешь не улучшать программу, а двигать её к тупику и последующему выбрасыванию и написанию всего заново. Это сейчас у тебя десять строк в коде, их ещё можно заново написать. Но когда она разрастётся, то 1000 строк уже так просто не выкинешь, уже жалко потраченное время, уже так просто не напишешь заново их.
Например, наши скрипты не предусматривают, что может не хватить ip на число файлов
VladimirvА ты думаешь, нафига я эту точку вывел там? Я мог бы её и вписать или вообще запустить os.listdir() с пустотой. Для того она и выведена, чтобы дальше его разрабатывать. Просто это может не понадобиться, поэтому это сразу и не сделано, просто выведено и приготовлено.
Другой вариант, что если скрипт запускается из другой директории или вообще по крону?
VladimirvОткрытый для изменений он должен быть. А у тебя с каждой строчкой всё больше и больше проблем. Ты просто пару изменений внесёшь и всё, от первоначальной программы ничего не останется, и ты будешь сидеть и сам свою программу не понимать. Это было у scidam'а, смотри вон у него всё поехало , это типичная история. Сначала ты пишешь вроде красивенький код, а потом надо что-то поменять и всё, от этого красивенького кода ничего не остаётся, получается какая-то запутанная фигня, в которой уже ничего не понятно.
Или сделай все предусматривающий вариант)
VladimirvТо, что ты написал, работает так, как ты и хотел. То есть это делается окружение и на нём запускается скрипт, а потом смотрится, всё ли правильно изменилось. Потому что может получиться так, что ты ждёшь определённое поведение и видишь его в коде, а по факту оно ведёт себя совсем по-другому. На проверку уходит столько же времени (и даже больше), чем на написание кода. То есть если ты написал код, то ты обязательно должен его запустить, иначе ты можешь пропереться, выложив теоретически работающий код, который не работает.
Что значит ‘с проверкой’?
Отредактировано py.user.next (Апрель 25, 2017 17:01:40)
Офлайн
7
py.user.nextБлин я то думал, что под тестированием подразумевалась какая-то хитроумная процедура, а тут просто запуск программы. Типа я этого не делал.
То, что ты написал, работает так, как ты и хотел. То есть это делается окружение и на нём запускается скрипт, а потом смотрится, всё ли правильно изменилось. Потому что может получиться так, что ты ждёшь определённое поведение и видишь его в коде, а по факту оно ведёт себя совсем по-другому. На проверку уходит столько же времени (и даже больше), чем на написание кода. То есть если ты написал код, то ты обязательно должен его запустить, иначе ты можешь пропереться, выложив теоретически работающий код, который не работает.
Офлайн
857
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]$
[guest@localhost repuser]$ ./repuser.py
Ok
[guest@localhost repuser]$
VladimirvА ты думаешь, я бежал? :D Не смеши мои тапки, там ещё есть что сделать для минимума, просто ему оно нафиг не нужно, эти файлы он будет менять в ближайшее время, а потом выкинет скрипт. А вот той девчонке (что выше приводил) я сделал по полной, потому что явно для работы ей надо, без этого она руками сделать всё не сможет.
Задачи надо решать по мере поступления, а запилка 1000 и 1 функции, так говоря на всякий случай, в мои планы не входит. Если что изменится, тогда и будем посмотреть) Так говоря, не собираюсь бежать впереди паровоза.
Отредактировано py.user.next (Апрель 25, 2017 17:59:18)
Офлайн