- en
- Language: ru
- Documentation version: latest
Конструкция 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
гарантирует закрытие файла
автоматически.
Обратите внимание на то, как считываются строки файла:
for line in f:
print(line)
Когда с файлом нужно работать построчно, лучше использовать такой вариант.
В предыдущем выводе, между строками файла были лишние пустые строки, так как 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)
...: