Найти - Пользователи
Полная версия: Прошу помощи. Супер сложное задание!
Начало » Python для новичков » Прошу помощи. Супер сложное задание!
1 2 3 4 5 6 7 8
py.user.next
Serggg
Есть 17 файлов - 1.txt и .xsh.
Перечисли имена всех файлов точно и их порядок запиши, чтобы не гадать.

Serggg
и вписать его в СООТВЕТСТВУЮЩИЙ файл в порядке простой очереди: 2ая строка - в 1ый файл, 3я строка во 2ой файл и т.д.
Опиши, каким образом определяется порядок файлов. Как ты определяешь, что первый файл - это первый файл, а не второй, что третий файл - это третий файл, а не второй? (Это называется бинарное отношение. Надо его определить ещё до написания программы.)
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.

В данный момент имя файла для редактирования в цикле определяется верно. Проблема в библиотеке parser - не получается заменить данные
scidam
Если эту задачу не нужно делать регулярно, вполне вероятно, что проще было переправить все файлы в текстовом редакторе. Хотя это и не очень изящно, но может быть вполне эффективно, что там 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
Однако, у вас должно хватить ip адресов в файле ip.txt на все другие файлы.
Serggg
Если эту задачу не нужно делать регулярно, вполне вероятно, что проще было переправить все файлы в текстовом редакторе. Хотя это и не очень изящно, но может быть вполне эффективно, что там 18 файлов исправить пару строк… 10 мин работы.
В том-то и дело, что повторять данные действия уже замучался и в будущем надо будет делать их в 100х объёме, вот и решил сделать через скрипт.

По поводу последней редакции кода. Ругается на не объявленный ind, объявил как сумел до цикла. Далее не понравилось, что файл не открыт для записи - после добавления ‘w’ - ругается что он не открыт для чтения - ААААААА как же сложнааааа)))

Сейчас ошибка следуюзщая: KeyError: ‘CONNECTION’

Тут я бессилен. Давайте уже добьём эту задачу готовым решением, позазуста

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
py.user.next
Решение на функциях.
Serggg
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

python - 2.7.3
py.user.next
Поставь третий питон.
Serggg
Вухуууу !! Работает, в точности так и требовалось, меняет верно все айпи адреса из файла 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(список айпи адресов)
py.user.next
За сортировку имён отвечает функция 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
Что изменить в скрипте
Надо сначала не в скрипте менять, а определить все возможные имена файлов и как они должны упорядочиваться относительно друг друга.

Но я бы сделал так, что увеличил количество обрабатываемых файлов с именами по одному определённому шаблону до любого количества, а потом любые входные файлы просто переименовывал в подходящие имена. Либо ввёл порядок для файлов с помощью дополнительного файла со списком имён в правильном порядке и брал бы имена файлов не из директории, а из этого файла.
Serggg
Попробовал применить скрипт, так сказать, в боевых условиях и сожалением обнаружил, что жестко заданный префикс файлов мешает всему процессу. Поменял в строке

     fname_pat = r'^filename_\d+_\d+.xsh$'

filename на нужный мне префикс, который по идее должен браться из 1ой строчки файла 1.txt. И на удивление, после запуска скрипта и отработки с ошибками все сработало как хотелось. На что заменить вышеуказанною строчку, чтобы префикс filanem был равен 1ой строчке файла 1.txt ?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB