Форум сайта python.su
857
SergggПеречисли имена всех файлов точно и их порядок запиши, чтобы не гадать.
Есть 17 файлов - 1.txt и .xsh.
SergggОпиши, каким образом определяется порядок файлов. Как ты определяешь, что первый файл - это первый файл, а не второй, что третий файл - это третий файл, а не второй? (Это называется бинарное отношение. Надо его определить ещё до написания программы.)
и вписать его в СООТВЕТСТВУЮЩИЙ файл в порядке простой очереди: 2ая строка - в 1ый файл, 3я строка во 2ой файл и т.д.
Отредактировано py.user.next (Апрель 13, 2017 06:27:35)
Офлайн
0
Со списком файлов всё просто. Есть три группы по 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.
В данный момент имя файла для редактирования в цикле определяется верно. Проблема в библиотеке parser - не получается заменить данные
Офлайн
35
Если эту задачу не нужно делать регулярно, вполне вероятно, что проще было переправить все файлы в текстовом редакторе. Хотя это и не очень изящно, но может быть вполне эффективно, что там 18 файлов исправить пару строк… 10 мин работы.
Попробуйте такой вариант:
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:]) ind = 0 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'] = hosts[ind] parser['CONNECTION:AUTHENTICATION']['UserName'] = username parser.write(fp) ind += 1
Отредактировано scidam (Апрель 14, 2017 04:06:27)
Офлайн
0
Если эту задачу не нужно делать регулярно, вполне вероятно, что проще было переправить все файлы в текстовом редакторе. Хотя это и не очень изящно, но может быть вполне эффективно, что там 18 файлов исправить пару строк… 10 мин работы.В том-то и дело, что повторять данные действия уже замучался и в будущем надо будет делать их в 100х объёме, вот и решил сделать через скрипт.
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:])
ind = 1
for ind1 in [1, 2, 3]:
for ind2 in range(1, 7):
with open('%s_%s_%s.xsh' %(username, ind1, ind2), 'r' ) as fp:
parser.read_string(unicode(fp.read()))
parser['CONNECTION']['Host'] = hosts[ind]
parser['CONNECTION:AUTHENTICATION']['UserName'] = username
parser.write(fp)
ind += 1
Офлайн
857
Офлайн
0
py.user.next, благодарю вас за ваше решение на функциях. К сожалению, данный код не отрабатывает на моём ПК полностю, а ввиду безусловно грамотной реализации мне крайне сложно сориентироваться и внести корректировки. Вывод такой -
Traceback (most recent call last): File "C:\Users\╥юїшэё\Documents\NetSarang\Xshell\Sessions\GPC_timothyrivera210 test\repuser\repuser.py", line 64, in <module> main() File "C:\Users\╥юїшэё\Documents\NetSarang\Xshell\Sessions\GPC_timothyrivera210 test\repuser\repuser.py", line 60, in main if process_files(ifname): File "C:\Users\╥юїшэё\Documents\NetSarang\Xshell\Sessions\GPC_timothyrivera210 test\repuser\repuser.py", line 8, in process_files username = get_control_username(control_fname) File "C:\Users\╥юїшэё\Documents\NetSarang\Xshell\Sessions\GPC_timothyrivera210 test\repuser\repuser.py", line 22, in get_control_username with open(ifname, encoding='utf-8') as fin: TypeError: 'encoding' is an invalid keyword argument for this function
Офлайн
857
Поставь третий питон.
Офлайн
0
Вухуууу !! Работает, в точности так и требовалось, меняет верно все айпи адреса из файла 1.txt и записывает в каждый файл заменяя айпи адреса и имя пользователя. Большое вам, человеческое спасибо!
Сейчас пытаюсь разобраться в коде. Понравилось, что все операции строго разделены на функции. Что нужно модицировать, чтобы программа работала тем же самым образом для структуры файлов большего размера. К примеру, бывает что файлов не
[filename_1.1;filename_1.2;filename_1.3…filename_1.6
filename_2.1…filename_2.6
filename_3.6], а 5 групп по 7 в каждой, т.е.
filename_n.m.xsh, где n = 5, m = 7.
И бывает второй случай, когда файлов 50штук с именами как у простого счётчика: 1.xsh, 2.xsh … 50.xsh
Принцип замены адресов в обоих случаях не меняется.
Проще говоря, в папке кроме файлов нуждающихся в замене данных с расширением *.xsh других нету. Что изменить в скрипте, чтобы он просто брал из списка один айпи адрес и записывал его в 1ый *.xsh файл, независимо от его имени, затем брал второй айпи адрес и писал его в следующий *.xsh и так пока не кончатся данные в файле 1.txt(список айпи адресов)
Отредактировано Serggg (Апрель 23, 2017 17:28:41)
Офлайн
857
За сортировку имён отвечает функция get_replace_file_names().
Но даже для большего количества файлов (n=5 m=7) всё будет работать. Но вот для десятков файлов её надо будет подредактировать. Я не стал заморачиваться изначально, потому что неочевидно было, что файловые имена могут быть разными и отсортированы по-разному. Поэтому сортировка применена простейшая (строковая), а должна быть немного более продвинутой (числовой).
Для компа файлы 1.xsh, 2.xsh, 10.xsh, 20.xsh находятся в порядке 1.xsh, 10.xsh, 2.xsh, 20.xsh. Поэтому надо брать имя, выделять из него подстроку-число, преобразовывать её в число и сравнивать уже числа. А для этого надо применить ряд приёмов.
SergggНадо сначала не в скрипте менять, а определить все возможные имена файлов и как они должны упорядочиваться относительно друг друга.
Что изменить в скрипте
Отредактировано py.user.next (Апрель 23, 2017 17:42:15)
Офлайн
0
Попробовал применить скрипт, так сказать, в боевых условиях и сожалением обнаружил, что жестко заданный префикс файлов мешает всему процессу. Поменял в строке
fname_pat = r'^filename_\d+_\d+.xsh$'
Офлайн