Вывод в файлы

vyvod v fajly Инструменты для работы с файлами и каталогами

Чтобы создать новый файл, следует вызвать функцию open с двумя аргументами: внешним именем создаваемого файла и строкой режима w(от write запись). Чтобы сохранить данные в файле, нужно вызвать метод write объекта файла со строкой, содержащей данные, которые нужно сохранить, а затем метод close, чтобы закрыть файл. Метод write вернет количество символов или байтов, записанных в файл (о котором мы не всегда будем упоминать для экономии места в книге). Вызов метода close, как мы увидим далее, не является обязательным, если вам требуется открыть и прочитать файл повторно в той же программе или сеансе:

C:\temp> python

>>> file = open(‘data.txt’, ‘w’) # откроет файл для вывода: создаст объект

>>> file.write(‘Hello file world!\n’) # запишет строку, как есть

18

>>> file.write(‘Bye file world.\n’) # вернет число символов/байтов

18

>>> file.close() # закрытие “сборщиком мусора” и выход

Вот и все — вы только что создали на своем компьютере, неважно каком, совершенно новый файл:

C:\temp> dir data.txt /B

data.txt

C:\temp> type data.txt Hello file world!

Bye file world.

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

Открытие файлов. В вызове функции open, показанном в предыдущем примере, первый аргумент может содержать необязательный полный путь к файлу. Если просто передать имя файла без указания пути, файл окажется в текущем рабочем каталоге Python. To есть он появится в том месте, откуда был запущен программный код, — в данном случае простое имя файла data.txt предполагает использование каталога C:\temp на моем компьютере, поэтому в реальности будет создан файл C:\temp\data.txt. Если быть более точным, в случае отсутствия абсолютного пути в имени файла путь к нему определяется относительно текущего рабочего каталога. Освежить эту тему в памяти можно с помощью раздела «Текущий рабочий каталог» (глава 3).

Обратите также внимание, что при открытии в режиме w Python либо создает новый файл, если он еще не существует, либо стирает текущее содержимое файла, если он уже присутствует (поэтому следует проявлять осторожность — при открытии в этом режиме вы потеряете все, что находилось в файле).

Запись. Обратите внимание, что в строки, записываемые в файл, был явно добавлен символ конца строки \n. В отличие от функции print, метод write объекта файла записывает в точности то, что ему передано, без дополнительного форматирования. Строка, переданная методу write, появляется во внешнем файле «символ в символ». При записи в текстовые файлы может выполняться преобразование символов конца строки или операция кодирования Юникода, о которых упоминалось выше, а когда позднее данные будут читаться из файла, автоматически будут выполнены обратные преобразования.

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

file.writelines([‘Hello file world!\n’, ‘Bye file world.\n’])

Этот метод используется не очень часто (и может эмулироваться простым циклом for и другими инструментами итераций), но его удобно использовать в сценариях, которые сначала сохраняют выходные данные в списке, а потом записывают его в файл.

Закрытие. Использованный выше метод файла close завершает формирование содержимого файла и освобождает системные ресурсы. Например, закрытие файла влечет выталкивание на диск буферизованных выходных данных. Обычно файлы автоматически закрываются, когда объект файла уничтожается интерпретатором при сборке мусора (то есть когда в сценарии исчезнет последняя ссылка на объект). Под этим подразумеваются все файлы, оставшиеся открытыми к моменту завершения программы или сеанса Python. По этой причине вызов метода close часто является необязательным. На практике часто можно увидеть программный код, обрабатывающий файлы, который использует эту идиому:

open(‘somefile.txt’, ‘w’).write(“Gday Bruce\n”) # записать во временный файл open(‘somefile.txt’, ‘r’).read() # прочитать временный файл

Так как в обоих выражениях создаются временные объекты файлов, сразу же осуществляется запись или чтение и при этом не сохраняются ссылки на них, объекты файлов немедленно автоматически закрываются и уничтожаются сразу после выполнения операции. В таких случаях нет никакой необходимости вызывать метод close явно.

Однако в некоторых контекстах вам может потребоваться явно закрывать файлы:

     Во-первых, реализация Jython опирается на механизм сборки мусора в интерпретаторе Java, поэтому вы не всегда можете знать, когда файлы будут закрыты, как вы это знаете при работе со стандартным Python. Если вы собираетесь запускать свой программный код на языке Python под управлением Jython, вам может потребоваться закрывать файлы вручную, если программа создает большое количество объектов файлов за короткое время (например, в цикле), чтобы избежать исчерпания файловых ресурсов в операционных системах, где их количество ограничено.

     Во-вторых, некоторые среды разработки, такие как стандартный графический интерфейс IDLE, могут удерживать объекты файлов дольше, чем хотелось бы (например, в объектах с трассировочной информацией о предыдущих ошибках), и тем самым препятствовать немедленной их утилизации сборщиком мусора. Выполняя запись в выходной файл в среде IDLE, обязательно закрывайте его явно (или вызывайте метод flush), если вам необходимо обеспечить достоверное чтение информации из этого файла в течение того же сеанса IDLE. В противном случае может получиться, что выходные буферы не будут вытеснены на диск, и при чтении вы получите неполные данные.

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

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

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий