Форум сайта python.su
Друзья, очень надеюсь на ваше гостеприимство и выручки в решении этой нелегкой задачи.
Сам я с этой задачей не смогу справится, очень нужна реализация на любом скриптовом языке. Выбор пал на python как на самый лаконичный язык.
Есть 17 файлов - 1.txt и .xsh. Все файлы содержат текстовые данные и лежат в одной папке. В первом файле содержится список айпи адресов начиная со второй строчки и до 17ой. В 1ой строке записан Username.
Задача: Взять из файла 1.txt Username и вписать его в каждый файл .xsh в строку UserName= после знака “=”. А после этого взять с каждой строчки IP-адрес и вписать его в СООТВЕТСТВУЮЩИЙ файл в порядке простой очереди: 2ая строка - в 1ый файл, 3я строка во 2ой файл и т.д. Вписывать IP-адрес необходимо в строку содержащую Host= так же после знака равно. В обоих случаях ввода данных в файлы необходимо будет заменить данные после знака =, то есть строки уже будут содержать какой-то Username и IP-адрес.
Невероятно сильно выручите если напишите код этого несложно для профессионала скрипта. Надеюсь на вашу помощь. Оба файла прилагаю для тестов. Очень жду сообщений
Прикреплённый файлы:
tech.nix355_1_1.xsh (3,3 KБ)
Офлайн
Адреса
Прикреплённый файлы:
1.txt (91 байт)
Офлайн
Для парсинга ini-подобных конфигурационных файлов очень хорошо подходит configparser;
Если я правильно понял, то следующий код практически решает вашу задачу, или очень близок к решению
import configparser parser = configparser.ConfigParser() parser.optionxform = str parser.read('tech.nix355_1_1.xsh') with open('1.txt', 'r') as fi: data = fi.readlines() username = data[0].strip() hosts = map(str.strip, data[1:]) for ind, host in enumerate(hosts): with open('newfile_%s.xsh' % ind, 'w') as fp: parser['CONNECTION']['Host'] = host parser['CONNECTION:AUTHENTICATION']['UserName'] = username parser.write(fp)
Офлайн
SergggЭто надо преобразовать файлы в текстовые строки.
Задача: …
scidamДа, близок к решению, но тебе повезло, что у него нечто похожее на ini-файл. А вдруг придётся работать с другим форматом или этот окажется не совсем ini? Придётся новую программу писать от начала до конца. А когда общую программу пишешь, то из-за работы с простым текстом формат не важен и при новом формате можно просто немножко поменять параметры скрипта или сам скрипт за пять минут и всё будет работать по-новому (но, главное, точно).
или очень близок к решению
Отредактировано py.user.next (Апрель 6, 2017 05:16:40)
Офлайн
scidamБлагодарю за отличный пример кода, который как раз выполняет что нужно. Скрипт необходимо немного доработать и после ломания головы над учебником питона я понял что без вас не справлюсь.
Для парсинга ini-подобных конфигурационных файлов очень хорошо подходит configparser;Если я правильно понял, то следующий код практически решает вашу задачу, или очень близок к решению
import configparser
parser = configparser.ConfigParser()
parser.optionxform = str
with open('ip.txt', 'r') as fi:
data = fi.readlines()
username = data[0].strip()
//передвинул чтение данных после определение переменной username
parser.read('%username_1_1.xsh')
hosts = map(str.strip, data[1:])
//двойной вложенный цикл нужен. 1ый уровень от 1 до 3, второй от 1 до 6
//и динамическое имя редактируемого файла. как сделать ?
for ind, host in enumerate(hosts):
with open('%username_%s.xsh' % ind, 'w') as fp:
parser['CONNECTION']['Host'] = host
parser['CONNECTION:AUTHENTICATION']['UserName'] = username
parser.write(fp)
Отредактировано Serggg (Апрель 6, 2017 22:55:51)
Офлайн
SergggЭто не для тебя поучения, а для scidam'а и других, кто захочет тебе писать код. Про тебя-то мы поняли, что ты и строчки написать не можешь, а программу эту простую (которую ты называешь СЛОЖНОЙ :o ) тем более не потянешь. Для этого структурное программирование надо знать, а в книжках по питону про него не пишут.
Поставил вам + в репу сразу как увидел код, вместо поучений типичных)))
SergggИ сейчас он тебе его не доработает, потому что изначально код написан так, что не предрасположен к доработке. (Есть правила определённые по написанию программ, чтобы они были легко меняемы. Программа должна быть правильной, понятной и легко меняемой. И вот для поддержки меняемости программы ответственность за действия программы распределяется по функциям. Программа представляет из себя такую змею как бы, где для изменения определённого поведения нужно залезть у неё только в один конкретный кусок, так что вся змея этого как бы не заметит, но в целом начнёт работать по-новому в нужном месте.)
Скрипт необходимо немного доработать
Отредактировано py.user.next (Апрель 7, 2017 01:38:32)
Офлайн
py.user.next
И сейчас он тебе его не доработает, потому что изначально код написан так, что не предрасположен к доработке
py.user.nextДа, похоже на правду …
И сейчас он тебе его не доработает
Serggg
и добавить в условие цикла динамическое формирование имени за счёт двух счётчиков из циклов for.
for ind1 in [1, 2, 3]: # Здесь так мало цифр, что это даже короче, чем range... for ind2 in range(1, 7): with open('%username_%s.xsh' % ind, 'rw') as fp: parser.read_string(fp.read()) #Здесь необходимые изменения, HOST, etc. parser.write(fp)
Офлайн
scidamЭто не проблема, можно на копии всё делать. Тут проблема в другом: ещё пару таких доработок и программа сначала станет нечитаемой, а потом начнёт ломать сама себя же при любом мелком исправлении. (Правило инкапсуляции кода нарушено.)
Однако, здесь мы сразу читаем файл, парсим, и в него же пишем
scidamА что если имя надо будет формировать по-другому (с вычислением даты, например, или около того), тут явно нужна функция по формированию имени, в которую можно спрятать весь код получения имени, каким бы сложным он ни был.with open('%username_%s.xsh' % ind, 'rw') as fp:
>>> '%username_%s.xsh' % 1 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: not enough arguments for format string >>>
Отредактировано py.user.next (Апрель 7, 2017 06:39:05)
Офлайн
py.user.nextДа. согласен, скопировал у Serggg с поста последнего; по его шаблону, видимо должно быть “filename_%s_%s” %(ind1, ind2).
Например, вот у тебя отрывок….Тут ещё баг нашёл
Офлайн
Доброй ночи scidam и py.user.next. Насколько долго меня хватило так это на разбор ошибки с неверными отступами - в питоне оказывается отступы влияют на структуру кода(небольшое открытия дня для меня :rolleyes, на правку строки с именем файла(спасибо знаниям С), и на добавление функции unicode для верного считывания строки из файла.
Загвоздка на последней стадии этого грандиозного проекта). Для меня именно так сие чудо и ощущается.
Как работает изменение строки Host и Username через следующий код:
parser['CONNECTION']['Host'] = host
parser['CONNECTION:AUTHENTICATION']['UserName'] = username
import configparser parser = configparser.ConfigParser() parser.optionxform = str with open('ip.txt', 'r') as fi: data = fi.readlines() username = data[0].strip() hosts = map(str.strip, data[1:]) for ind1 in [1, 2, 3]: for ind2 in range(1, 7): with open('%s_%s_%s.xsh' %(username, ind1, ind2)) as fp: parser.read_string(unicode(fp.read())) parser['CONNECTION']['Host'] = host parser['CONNECTION:AUTHENTICATION']['UserName'] = username parser.write(fp)
Офлайн