Книга: PyNEng
Назад: Чтение файлов
Дальше: Закрытие файлов

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

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

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

  • 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', 

Или использовать list comprehensions:

In [16]: cfg_lines3 = [ line + '\n' for line in cfg_lines ]  In [17]: cfg_lines3 Out[17]: ['!\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'] 

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

In [18]: f = open('r2.txt', 'w')  In [19]: f.writelines(cfg_lines3)  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 ! 
Назад: Чтение файлов
Дальше: Закрытие файлов