📜  使用Python的print函数写入文件

📅  最后修改于: 2020-08-24 07:24:48             🧑  作者: Mango

介绍

Python的print()功能通常用于在命令行或交互式解释器中显示文本,具体取决于Python程序的执行方式。但是,我们可以更改其行为,以将文本写入文件而不是控制台。

在本文中,我们将研究使用该print()函数写入文件的多种方式。

在终端中重定向Python的脚本输出

重定向Python脚本输出的快速而肮脏的方法是直接在执行脚本时从命令行进行。

例如,如果我们有一个名为Python的文件hello.py,其内容如下:

print("Hallo") # Deliberately in German

我们可以使用单个直角括号将文件的输出重定向到Shell中:

$ 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()函数中的参数中指定类似文件的对象。