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

Введение Функция Python print () обычно используется для отображения текста либо в командной строке, либо в интерактивном интерпретаторе, в зависимости от того, как выполняется программа Python. Однако мы можем изменить его поведение, чтобы записывать текст в файл, а не в консоль. В этой статье мы рассмотрим множество способов записи в файл с помощью функции print (). Перенаправление вывода скрипта Python в терминал Быстрый и грязный способ перенаправить вывод скрипта 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) 

Заключение

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

об авторе

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

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus