Вы здесь

Python. 1.4 Работа с файлами

При работе с сетевым оборудованием (и не только), файлами могут быть:
- конфигурации (простые, не структурированные текстовые файлы)
- шаблоны конфигураций
- файлы с параметрами подключений. как правило, это структурированные файлы, в каком-то определенном формате: YAML, JSON, CSV
- другие скрипты Python. Например Модули

В работе с файлами есть несколько аспектов:
- открытие/закрытие
- чтение
- запись

Открытие файлов

Для открытия файлов, чаще всего, используется функция open:

file = open('file_name.txt', 'r')

В функции open():
- 'file_name.txt' - имя файла. тут можно указывать не только имя, но и путь (абсолютный или относительный)
- 'r' - режим открытия файла

Функция open создает объект file, к которому потом можно применять различные методы, для работы с ним.
Режимы открытия файлов:

  • r - открыть файл только для чтения (значение по умолчанию)
  • r+ - открыть файл для чтения и записи
  • w - открыть файл для записи
    - если файл существует, то его содержимое удаляется
    - если файл не существует, то создается новый
  • w+ - открыть файл для чтения и записи
    - если файл существует, то его содержимое удаляется
    - если файл не существует, то создается новый
  • a - открыть файл для дополнения записи. Данные добавляются в конец файла
  • a+ - открыть файл для чтения и записи. Данные добавляются в конец файла

Чтение файлов

В Python есть несколько методов чтения файла:
- read - считывает содержимое файла в строку
- readline - считывает файл построчно
- readlines - считывает строки файла и создает список из строк

Посмотрим как считывать содержимое файлов, на примере файла r1.txt:

! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !

read

Метод read - считывает весь файл в одну строку.

Пример использования метода read:

In [1]: f = open('r1.txt') In [2]: f.read() Out[2]: '!\nservice timestamps debug datetime msec localtime show-timezone year\nservice timestamps log datetime msec localtime show-timezone year\nservice password-encryption\nservice sequence-numbers\n!\nno ip domain lookup\n!\nip ssh version 2\n!\n' In [3]: f.read() Out[3]: ''

При повторном чтении файла в 3 строке, отображается пустая строка. Так происходит из-за того, что при вызове метода read, считывается весь файл. И после того, как файл был считан, курсор остается в конце файла. Управлять положением курсора можно с помощью метода seek.

readline

Построчно файл можно считать с помощью метода readline:

In [4]: f = open('r1.txt') In [5]: f.readline() Out[5]: '!\n' In [6]: f.readline() Out[6]: 'service timestamps debug datetime msec localtime show-timezone year\n'

Но чаще всего проще пройтись по объекту file в цикле, не используя методы read...:

In [7]: f = open('r1.txt') In [8]: for line in f: ...: print(line) ...: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !

readlines

Еще один полезный метод - readlines. Он считывает строки файла в список:

In [9]: f = open('r1.txt') In [10]: f.readlines() Out[10]: ['!\n', 'service timestamps debug datetime msec localtime show-timezone year\n', 'service timestamps log datetime msec localtime show-timezone year\n', 'service password-encryption\n', 'service sequence-numbers\n', '!\n', 'no ip domain lookup\n', '!\n', 'ip ssh version 2\n', '!\n']

Если нужно получить строки файла, но без перевода строки в конце, можно воспользоваться методом split и как разделитель, указать символ \n:

In [11]: f = open('r1.txt') In [12]: f.read().split('\n') Out[12]: ['!', 'service timestamps debug datetime msec localtime show-timezone year', 'service timestamps log datetime msec localtime show-timezone year', 'service password-encryption', 'service sequence-numbers', '!', 'no ip domain lookup', '!', 'ip ssh version 2', '!', '']

Обратите внимание, что последний элемент списка - пустая строка.
Если перед выполнением split, воспользоваться методом rstrip, список будет без пустой строки в конце:

In [13]: f = open('r1.txt') In [14]: f.read().rstrip().split('\n') Out[14]: ['!', 'service timestamps debug datetime msec localtime show-timezone year', 'service timestamps log datetime msec localtime show-timezone year', 'service password-encryption', 'service sequence-numbers', '!', 'no ip domain lookup', '!', 'ip ssh version 2', '!']

seek

До сих пор, файл каждый раз приходилось открывать заново, чтобы снова его считать. Так происходит из-за того, что после методов чтения, курсор находится в конце файла. И повторное чтение возвращает пустую строку.

Чтобы ещё раз считать информацию из файла, нужно воспользоваться методом seek, который перемещает курсор в необходимое положение.

Пример открытия файла и считывания содержимого:

In [15]: f = open('r1.txt') In [16]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 ! In [17]: print(f.read()) Out[17]: '' In [18]: f.seek(0) In [19]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !

Запись файлов

При записи, очень важно определиться с режимом открытия файла, чтобы случайно его не удалить:

- w - открыть файл для записи. Если файл существует, то его содержимое удаляется
- a - открыть файл для дополнения записи. Данные добавляются в конец файла

При этом оба режима создают файл, если он не существует.

Для записи в файл используются такие методы:

- write - записать в файл одну строку
- writelines - позволяет передавать в качестве аргумента список строк

write

Метод write ожидает строку, для записи.

Для примера, возьмем список строк с конфигурацией:

In [1]: cfg_lines = ['!', ...: 'service timestamps debug datetime msec localtime show-timezone year', ...: 'service timestamps log datetime msec localtime show-timezone year', ...: 'service password-encryption', ...: 'service sequence-numbers', ...: '!', ...: 'no ip domain lookup', ...: '!', ...: 'ip ssh version 2', ...: '!']

Открытие файла r2.txt в режиме для записи:

In [2]: f = open('r2.txt', 'w')

Преобразуем список команд в одну большую строку с помощью join:

In [3]: cfg_lines_as_string = '\n'.join(cfg_lines) In [4]: cfg_lines_as_string Out[4]: '!\nservice timestamps debug datetime msec localtime show-timezone year\nservice timestamps log datetime msec localtime show-timezone year\nservice password-encryption\nservice sequence-numbers\n!\nno ip domain lookup\n!\nip ssh version 2\n!'

Запись строки в файл:

In [5]: f.write(cfg_lines_as_string)

Аналогично можно добавить строку вручную:

In [6]: f.write('\nhostname r2')

После завершения работы с файлом, его необходимо закрыть:

In [7]: f.close()

Так как ipython поддерживает команду cat, можно легко посмотреть содержимое файла:

In [8]: cat r2.txt ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 ! hostname r2

writelines

Метод writelines ожидает список строк, как аргумент.

Запись списка строк cfg_lines в файл:

In [1]: cfg_lines = ['!', ...: 'service timestamps debug datetime msec localtime show-timezone year', ...: 'service timestamps log datetime msec localtime show-timezone year', ...: 'service password-encryption', ...: 'service sequence-numbers', ...: '!', ...: 'no ip domain lookup', ...: '!', ...: 'ip ssh version 2', ...: '!'] In [9]: f = open('r2.txt', 'w') In [10]: f.writelines(cfg_lines) In [11]: f.close() In [12]: cat r2.txt !service timestamps debug datetime msec localtime show-timezone yearservice timestamps log datetime msec localtime show-timezone yearservice password-encryptionservice sequence-numbers!no ip domain lookup!ip ssh version 2!

В результате все строки из списка записались в одну строку файла, так как в конце строк не было символа \n.

Добавить перевод строки можно по-разному. Например, можно просто обработать список в цикле:

In [13]: cfg_lines2 = [] In [14]: for line in cfg_lines: ....: cfg_lines2.append(line + '\n') ....: In [15]: cfg_lines2 Out[15]: ['!\n', 'service timestamps debug datetime msec localtime show-timezone year\n', 'service timestamps log datetime msec localtime show-timezone year\n', 'service password-encryption\n', 'service sequence-numbers\n', '!\n', 'no ip domain lookup\n', '!\n', 'ip ssh version 2\n',

Если итоговый список записать заново в файл, то в нём уже будут переводы строк:

In [18]: f = open('r2.txt', 'w') In [19]: f.writelines(cfg_lines2) In [20]: f.close() In [21]: cat r2.txt ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !

Закрытие файлов

В реальной жизни для закрытия файлов чаще всего используется конструкция with. Её намного удобней использовать, чем закрывать файл явно. Но, так как в жизни можно встретить и метод close, в этом разделе рассматривается как его использовать.

После завершения работы с файлом, его нужно закрыть. В некоторых случаях Python может самостоятельно закрыть файл. Но лучше на это не рассчитывать и закрывать файл явно.

close

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

Для этого, в Python есть отдельный метод flush. Но так как в примере с записью файлов, не нужно было больше выполнять никаких операций, файл можно было закрыть.

Откроем файл r1.txt:

In [1]: f = open('r1.txt', 'r') In [2]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !

У объекта file есть специальный атрибут closed, который позволяет проверить, закрыт файл или нет. Если файл открыт, он возвращает False:

In [3]: f.closed Out[3]: False

Теперь закрываем файл и снова проверяем closed:

In [4]: f.close() In [5]: f.closed Out[5]: True

Если попробовать прочитать файл, возникнет исключение:

In [6]: print(f.read()) ------------------------------------------------------------------ ValueError Traceback (most recent call last) in () ----> 1 print(f.read()) ValueError: I/O operation on closed file

Конструкция with

Конструкция with называется менеджер контекста.

В Python существует более удобный способ работы с файлами, чем те, которые использовались до сих пор - конструкция with:

In [1]: with open('r1.txt', 'r') as f: ....: for line in f: ....: print(line) ....: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !

Кроме того, конструкция with гарантирует закрытие файла автоматически.

В предыдущем выводе, между строками файла были лишние пустые строки, так как print добавляет ещё один перевод строки.
Чтобы избавиться от этого, можно использовать метод rstrip:

In [2]: with open('r1.txt', 'r') as f: ....: for line in f: ....: print(line.rstrip()) ....: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 ! In [3]: f.closed Out[3]: True

И конечно же, с конструкцией with можно использовать не только такой построчный вариант считывания, все методы, которые рассматривались до этого, также работают:

In [4]: with open('r1.txt', 'r') as f: ....: print(f.read()) ....: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !

Открытие двух файлов

Иногда нужно работать одновременно с двумя файлами. Например, надо записать некоторые строки из одного файла, в другой.

В таком случае, в блоке with можно открывать два файла таким образом:

In [5]: with open('r1.txt') as src, open('result.txt', 'w') as dest: ...: for line in src: ...: if line.startswith('service'): ...: dest.write(line) ...: In [6]: cat result.txt service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers

Это равнозначно таким двум блокам with:

In [7]: with open('r1.txt') as src: ...: with open('result.txt', 'w') as dest: ...: for line in src: ...: if line.startswith('service'): ...: dest.write(line) ...:

Примеры работы с файлами

Разбор вывода столбцами

В этом примере будет разбираться вывод команды sh ip int br. Из вывода команды нам надо получить соответствия имя интерфейса - IP-адрес. То есть имя интерфейса - это ключ словаря, а IP-адрес - значение. При этом, соответствие надо делать только для тех интерфейсов, у которых назначен IP-адрес.

Пример вывода команды sh ip int br (файл sh_ip_int_br.txt):

R1#show ip interface brief Interface IP-Address OK? Method Status Protocol FastEthernet0/0 15.0.15.1 YES manual up up FastEthernet0/1 10.0.12.1 YES manual up up FastEthernet0/2 10.0.13.1 YES manual up up FastEthernet0/3 unassigned YES unset up down Loopback0 10.1.1.1 YES manual up up Loopback100 100.0.0.1 YES manual up up

Файл working_with_dict_example_1.py:

result = {} with open('sh_ip_int_br.txt') as f: for line in f: line = line.split() if line and line[1][0].isdigit(): interface, address, *other = line result[interface] = address print(result)

Команда sh ip int br отображает вывод столбцами. Значит нужные поля находятся в одной строке. Скрипт обрабатывает вывод построчно и каждую строку разбивает с помощью метода split.

Полученный в итоге список содержит столбцы вывода. Так как из всего вывода нужны только интерфейсы на которых настроен IP-адрес, выполняется проверка первого символа второго столбца: если первый символ число, значит на интерфейсе назначен адрес и эту строку надо обрабатывать.

В строке interface, address, *other = line выполняется распаковка переменных. В переменную interface попадет имя интерфейса, в address попадет IP-адрес, а в other все остальные поля.

Так как для каждой строки есть пара ключ и значение, они присваиваются в словарь: result[interface] = address.

Результатом выполнения скрипта будет такой словарь (тут он разбит на пары ключ-значение для удобства, в реальном выводе скрипта словарь будет отображаться в одну строку):

{'FastEthernet0/0': '15.0.15.1', 'FastEthernet0/1': '10.0.12.1', 'FastEthernet0/2': '10.0.13.1', 'Loopback0': '10.1.1.1', 'Loopback100': '100.0.0.1'}

Получение ключа и значения из разных строк вывода

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

Например, из вывода команды sh ip interface надо получить соответствие имя интерфейса - MTU (файл sh_ip_interface.txt):

Ethernet0/0 is up, line protocol is up Internet address is 192.168.100.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ... Ethernet0/1 is up, line protocol is up Internet address is 192.168.200.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ... Ethernet0/2 is up, line protocol is up Internet address is 19.1.1.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ...

Имя интерфейса находится в строке вида Ethernet0/0 is up, line protocol is up, а MTU в строке вида MTU is 1500 bytes.

Например, попробуем запоминать каждый раз интерфейс и выводить его значение, когда встречается MTU, вместе со значением MTU:

In [2]: with open('sh_ip_interface.txt') as f: ...: for line in f: ...: if 'line protocol' in line: ...: interface = line.split()[0] ...: elif 'MTU is' in line: ...: mtu = line.split()[-2] ...: print('{:15}{}'.format(interface, mtu)) ...: Ethernet0/0 1500 Ethernet0/1 1500 Ethernet0/2 1500 Ethernet0/3 1500 Loopback0 1514

Вывод организован таким образом, что всегда сначала идет строка с интерфейсом, а затем через несколько строк - строка с MTU. Если запоминать имя интерфейса каждый раз, когда оно встречается, то на момент когда встретится строка с MTU, последний запомненный интерфейс - это тот к которому относится MTU.

Теперь, если необходимо создать словарь с соответствием интерфейс - MTU, достаточно записать значения на момент, когда был найден MTU.
Файл working_with_dict_example_2.py:

result = {} with open('sh_ip_interface.txt') as f: for line in f: if 'line protocol' in line: interface = line.split()[0] elif 'MTU is' in line: mtu = line.split()[-2] result[interface] = mtu print(result)

Результатом выполнения скрипта будет такой словарь (тут он разбит на пары ключ-значение для удобства, в реальном выводе скрипта словарь будет отображаться в одну строку):

{'Ethernet0/0': '1500', 'Ethernet0/1': '1500', 'Ethernet0/2': '1500', 'Ethernet0/3': '1500', 'Loopback0': '1514'}

Вложенный словарь

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

Например, из вывода `sh ip interface` надо получить два параметра: IP-адрес и MTU. Для начала, вывод информации:

Ethernet0/0 is up, line protocol is up Internet address is 192.168.100.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ... Ethernet0/1 is up, line protocol is up Internet address is 192.168.200.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ... Ethernet0/2 is up, line protocol is up Internet address is 19.1.1.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ...

На первом этапе каждое значение запоминается в переменную, а затем, выводятся все три значения. Значения выводятся, когда встретилась строка с MTU, потому что она идет последней:

In [2]: with open('sh_ip_interface.txt') as f: ...: for line in f: ...: if 'line protocol' in line: ...: interface = line.split()[0] ...: elif 'Internet address' in line: ...: ip_address = line.split()[-1] ...: elif 'MTU' in line: ...: mtu = line.split()[-2] ...: print('{:15}{:17}{}'.format(interface, ip_address, mtu)) ...: Ethernet0/0 192.168.100.1/24 1500 Ethernet0/1 192.168.200.1/24 1500 Ethernet0/2 19.1.1.1/24 1500 Ethernet0/3 192.168.230.1/24 1500 Loopback0 4.4.4.4/32 1514

Тут используется такой же прием, как в предыдущем примере, но добавляется еще одна вложенность словаря:

result = {} with open('sh_ip_interface.txt') as f: for line in f: if 'line protocol' in line: interface = line.split()[0] result[interface] = {} elif 'Internet address' in line: ip_address = line.split()[-1] result[interface]['ip'] = ip_address elif 'MTU' in line: mtu = line.split()[-2] result[interface]['mtu'] = mtu print(result)

Каждый раз, когда встречается интерфейс, в словаре `result` создается ключ с именем интерфейса, которому соответствует пустой словарь. Эта заготовка нужна для того, чтобы на момент когда встретится IP-адрес или MTU можно было записать параметр во вложенный словарь соответствующего интерфейса.

Результатом выполнения скрипта будет такой словарь (тут он разбит на пары ключ-значение для удобства, в реальном выводе скрипта словарь будет отображаться в одну строку):

{'Ethernet0/0': {'ip': '192.168.100.1/24', 'mtu': '1500'}, 'Ethernet0/1': {'ip': '192.168.200.1/24', 'mtu': '1500'}, 'Ethernet0/2': {'ip': '19.1.1.1/24', 'mtu': '1500'}, 'Ethernet0/3': {'ip': '192.168.230.1/24', 'mtu': '1500'}, 'Loopback0': {'ip': '4.4.4.4/32', 'mtu': '1514'}}

Вывод с пустыми значениями

Иногда, в выводе будут попадаться секции с пустыми значениями. Например, в случае с выводом `sh ip interface`, могут попадаться интерфейсы, которые выглядят так:

Ethernet0/1 is up, line protocol is up Internet protocol processing disabled Ethernet0/2 is administratively down, line protocol is down Internet protocol processing disabled Ethernet0/3 is administratively down, line protocol is down Internet protocol processing disabled

Соответственно тут нет MTU или IP-адреса.

И если выполнить предыдущий скрипт для файла с такими интерфейсами, результат будет таким (вывод для файла sh_ip_interface2.txt):

{'Ethernet0/0': {'ip': '192.168.100.2/24', 'mtu': '1500'}, 'Ethernet0/1': {}, 'Ethernet0/2': {}, 'Ethernet0/3': {}, 'Loopback0': {'ip': '2.2.2.2/32', 'mtu': '1514'}}

Если необходимо добавлять интерфейсы в словарь только, когда на интерфейсе назначен IP-адрес, надо перенести создание ключа с именем интерфейса на момент, когда встречается строка с IP-адресом (файл working_with_dict_example_4.py):

result = {} with open('sh_ip_interface2.txt') as f: for line in f: if 'line protocol' in line: interface = line.split()[0] elif 'Internet address' in line: ip_address = line.split()[-1] result[interface] = {} result[interface]['ip'] = ip_address elif 'MTU' in line: mtu = line.split()[-2] result[interface]['mtu'] = mtu print(result)

В этом случае результатом будет такой словарь:

{'Ethernet0/0': {'ip': '192.168.100.2/24', 'mtu': '1500'}, 'Loopback0': {'ip': '2.2.2.2/32', 'mtu': '1514'}}

Задания

  1. Задание 7.1

    Обработать строки из файла ospf.txt и вывести информацию по каждой строке в таком виде на стандартный поток вывода:

    Prefix 10.0.24.0/24 AD/Metric 110/41 Next-Hop 10.0.13.3 Last update 3d18h Outbound Interface FastEthernet0/0

    ospf.txt

    O 10.0.24.0/24 [110/41] via 10.0.13.3, 3d18h, FastEthernet0/0 O 10.0.28.0/24 [110/31] via 10.0.13.3, 3d20h, FastEthernet0/0 O 10.0.37.0/24 [110/11] via 10.0.13.3, 3d20h, FastEthernet0/0 O 10.0.41.0/24 [110/51] via 10.0.13.3, 3d20h, FastEthernet0/0 O 10.0.78.0/24 [110/21] via 10.0.13.3, 3d20h, FastEthernet0/0 O 10.0.79.0/24 [110/20] via 10.0.19.9, 4d02h, FastEthernet0/2

    Решение

    task_7_1.py

  2. Задание 7.2

    Создать скрипт, который будет обрабатывать конфигурационный файл config_sw1.txt. Имя файла передается как аргумент скрипту.
    Скрипт должен возвращать на стандартный поток вывода команды из переданного конфигурационного файла, исключая строки, которые начинаются с !.
    Вывод должен быть без пустых строк.

    Пример вывода:

    $ python task_7_2.py config_sw1.txt Current configuration : 2033 bytes version 15.0 service timestamps debug datetime msec service timestamps log datetime msec no service password-encryption hostname sw1 interface Ethernet0/0 duplex auto interface Ethernet0/1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100 switchport mode trunk duplex auto spanning-tree portfast edge trunk interface Ethernet0/2 duplex auto interface Ethernet0/3 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100 duplex auto switchport mode trunk spanning-tree portfast edge trunk ...

    Решение

    task_7_2.py

    Вторая версия без использования Continue:
    task_7_2_ver2.py

  3. Задание 7.2a

    Сделать копию скрипта задания 7.2.
    Дополнить скрипт: Скрипт не должен выводить команды, в которых содержатся слова, которые указаны в списке ignore.
    При этом скрипт также не должен выводить строки, которые начинаются на !.
    Проверить работу скрипта на конфигурационном файле config_sw1.txt. Имя файла передается как аргумент скрипту.

    ignore = ["duplex", "alias", "configuration"]

    Решение

    task_7_2a.py

    Решение при использовании пересечения множеств:
    task_7_2a_ver2.py

  4. Задание 7.2b

    Переделать скрипт из задания 7.2a: вместо вывода на стандартный поток вывода, скрипт должен записать полученные строки в файл

    Имена файлов нужно передавать как аргументы скрипту:

    имя исходного файла конфигурации
    имя итогового файла конфигурации
    При этом, должны быть отфильтрованы строки, которые содержатся в списке ignore и строки, которые начинаются на „!“.

    Решение

    task_7_2b.py

  5. Задание 7.3

    Скрипт должен обрабатывать записи в файле CAM_table.txt. Каждая строка, где есть MAC-адрес, должна быть обработана таким образом, чтобы на стандартный поток вывода была выведена таблица вида:

    100 01bb.c580.7000 Gi0/1 200 0a4b.c380.7c00 Gi0/2 300 a2ab.c5a0.700e Gi0/3 10 0a1b.1c80.7000 Gi0/4 500 02b1.3c80.7b00 Gi0/5 200 1a4b.c580.7000 Gi0/6 300 0a1b.5c80.70f0 Gi0/7 10 01ab.c5d0.70d0 Gi0/8 1000 0a4b.c380.7d00 Gi0/9

    CAM_table.txt

    sw1#sh mac address-table Mac Address Table ------------------------------------------- Vlan Mac Address Type Ports ---- ----------- -------- ----- 100 01bb.c580.7000 DYNAMIC Gi0/1 200 0a4b.c380.7c00 DYNAMIC Gi0/2 300 a2ab.c5a0.700e DYNAMIC Gi0/3 10 0a1b.1c80.7000 DYNAMIC Gi0/4 500 02b1.3c80.7b00 DYNAMIC Gi0/5 200 1a4b.c580.7000 DYNAMIC Gi0/6 300 0a1b.5c80.70f0 DYNAMIC Gi0/7 10 01ab.c5d0.70d0 DYNAMIC Gi0/8 1000 0a4b.c380.7d00 DYNAMIC Gi0/9

    Решение

    task_7_3.py

  6. Задание 7.3a
    Сделать копию скрипта задания 7.3.

    Переделать скрипт: Отсортировать вывод по номеру VLAN В результате должен получиться такой вывод:

    10 01ab.c5d0.70d0 Gi0/8 10 0a1b.1c80.7000 Gi0/4 100 01bb.c580.7000 Gi0/1 200 0a4b.c380.7c00 Gi0/2 200 1a4b.c580.7000 Gi0/6 300 0a1b.5c80.70f0 Gi0/7 300 a2ab.c5a0.700e Gi0/3 500 02b1.3c80.7b00 Gi0/5 1000 0a4b.c380.7d00 Gi0/9

    Решение

    task_7_3a.py

  7. Задание 7.3b

    Сделать копию скрипта задания 7.3a.

    Переделать скрипт:

    - Запросить у пользователя ввод номера VLAN.
    - Выводить информацию только по указанному VLAN.
    Пример работы скрипта:

    Enter VLAN number: 10 10 0a1b.1c80.7000 Gi0/4 10 01ab.c5d0.70d0 Gi0/8

    Решение

    task_7_3b.py

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Target Image