Рубрики
Без рубрики

Запись в файл с помощью функции print() Python

Функция печати Python обычно используется для отображения текста либо в консоли. Мы также можем использовать функцию печати для записи в файл. Эта статья покажет вам, как это сделать.

Автор оригинала: Jacob Stopak.

Запись в файл с помощью функции print() Python

Вступление

Функция Python print() обычно используется для отображения текста либо в командной строке, либо в интерактивном интерпретаторе, в зависимости от того, как выполняется программа Python. Однако мы можем изменить его поведение, чтобы записать текст в файл, а не в консоль.

В этой статье мы рассмотрим множество способов записи в файл с помощью функции print () .

Перенаправление вывода скрипта Python в терминале

Самый быстрый и грязный способ перенаправить вывод скрипта Python-это непосредственно из командной строки во время выполнения скрипта.

Например, если бы у нас был файл Python с именем hello.py со следующим содержанием:

print("Hallo") # Deliberately in German

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

$ python3 hello.py > output.txt

Если мы откроем наш вновь созданный output.txt , мы увидим следующее содержание:

Hallo

Однако при использовании этого метода все выходные данные скрипта записываются в файл. Часто более гибко выполнять это перенаправление из самого скрипта Python.

Перенаправление стандартного выходного потока

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

Все системы UNIX имеют три основных канала – стандартный входной канал ( stdin ), стандартный выходной канал ( stdout ) и стандартный канал ошибок ( stderr ).

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

Если стандартный вывод перенаправляется в определенный файл, то текст, указанный в функции print () , будет записан в этот файл вместо отображения на экране.

В Python ссылка на стандартный вывод может быть получена с помощью объекта stdout модуля sys . Это файлоподобный объект , то есть у него есть методы, которые позволяют Python читать и писать из него, как из реального файла.

Давайте посмотрим пример, где мы меняем stdout на файл:

import sys

print('This message will be displayed on the screen.')

original_stdout = sys.stdout # Save a reference to the original standard output

with open('filename.txt', 'w') as f:
    sys.stdout = f # Change the standard output to the file we created.
    print('This message will be written to a file.')
    sys.stdout = original_stdout # Reset the standard output to its original value

Функция print() принимает предоставленный строковый аргумент, добавляет символ новой строки в конец и вызывает stdout.write() метод для записи его в стандартный вывод.

В приведенном выше примере мы сначала печатаем строку текста, как мы привыкли, которая будет отображаться в консоли при запуске файла. Затем мы переназначили stdout нашему пользовательскому файловому объекту – f . Поскольку файловый объект имеет вполне допустимый метод write () , наше печатное значение записывается в файл без проблем.

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

Давайте сохраним код в новый файл, printToFile.py . А потом давайте его выполним:

$ python3 printToFile.py

Мы увидим следующий вывод в терминале:

This message will be displayed on the screen.

И скрипт создаст новый файл с именем filename.txt со следующим содержанием:

This message will be written to a file.

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

Перенаправление стандартного потока ошибок

В Python ошибки записываются в стандартный поток ошибок , также известный как stderr . Это также по умолчанию интерактивное окно, но может быть изменено с помощью объекта sys.stderr . Если бы мы хотели вывести значения в stderr , мы могли бы просто перенаправить sys.stdout , чтобы указать на sys.stderr .

Создайте файл с именем printToStderr.py и добавьте следующий код:

import sys

print('This message will be displayed via standard output.')

original_stdout = sys.stdout # Save a reference to the original standard output

sys.stdout = sys.stderr # Redirect the standard output to the standard error.
print('This message will be displayed via the standard error.')

sys.stdout = original_stdout # Reset the standard output to its original value

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

Давайте запустим этот файл:

$ python3 printToStderr.py

Наш выход показал бы:

This message will be displayed via standard output.
This message will be displayed via the standard error.

Хотя для нас это может показаться обычным выводом, для компьютера он отображается через различные конвейеры.

Печать с помощью параметра “файл”

В предыдущих примерах мы явно перенаправили стандартный вывод на другой файлоподобный объект, изменив объект stdout . Однако для удобства мы можем сделать это непосредственно из функции print () , указав местоположение вывода с помощью параметра file :

Например, если бы мы хотели печатать непосредственно в файл , не изменяя весь сценарий stdout , мы бы написали:

import sys

print('This message will be displayed on the screen.')

with open('filename.txt', 'w') as f:
    print('This message will be written to a file.', file=f)

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

Примечание: Хотя имя параметра file , помните, что он работает с любым файлоподобным объектом. Например , если вы хотите напечатать в stderr , вы должны изменить оператор print() на:

print('This message will be written to stderr.', file=sys.stderr)

Вывод

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

Об авторе

Эта статья была написана Джейкобом Стопаком, разработчиком программного обеспечения и консультантом, страстно желавшим помочь другим улучшить свою жизнь с помощью кода. Джейкоб является автором руководства Coding Essentials Guidebook for Developers , вводной книги, которая охватывает основные концепции и инструменты кодирования. Он содержит главы по базовой компьютерной архитектуре, Интернету, командной строке, HTML, CSS, JavaScript, Python, Java, базам данных/SQL, Git и многим другим.