python 捕获 调用函数中 print 内容到指定文件

在 Python 3 中,可以使用 contextlib.redirect_stdout 上下文管理器将函数中的打印内容重定向到文件中。下面是一个例子:

import contextlib
import io

def my_function():
    print("This is the print content inside the function.")  # 函数中的打印内容

# 打开文件以写入函数的打印输出内容
with open('output.txt', 'w') as file:
    # 使用 io.StringIO 创建一个临时的字符串缓冲区作为打印输出的目标
    with contextlib.redirect_stdout(file), io.StringIO() as buffer:
        # 将缓冲区设置为标准输出,并在函数执行时捕获打印内容
        with contextlib.redirect_stdout(buffer):
            my_function()  # 调用函数

        # 将缓冲区中的内容写入文件
        file.write(buffer.getvalue())

上述代码中,首先定义了一个包含打印内容的函数 my_function()。然后,使用 with open('output.txt', 'w') as file 打开一个文件,以便将函数的打印输出内容写入。(也可以使用 with open('output.txt', 'a’) as file 打开一个文件,追加写入到output.txt中)

接下来,在 with contextlib.redirect_stdout(file), io.StringIO() as buffer 的上下文管理器中,使用 contextlib.redirect_stdout 将标准输出重定向到文件 file,并使用 io.StringIO() 创建一个字符串缓冲区作为临时的打印输出目标。

在 with contextlib.redirect_stdout(buffer) 的上下文管理器中,将缓冲区设置为标准输出,并在调用函数 my_function() 时捕获函数中的打印内容。

最后,使用 buffer.getvalue() 获取缓冲区中的内容,并将其写入文件中。

这样,函数 my_function() 中的打印内容将被重定向到指定的文件 output.txt 中。可以根据需要修改文件名和路径。当然,也可以采用更为简单的方法,直接print 到文件之中,代码如下:

import contextlib
import sys

def my_function():
    print('Hello, World!')

with open('output.txt', 'w') as f:
    with contextlib.redirect_stdout(f):
        my_function()

# Now the 'Hello, World!' is printed into 'output.txt' instead of console.

Python 的 print 函数有缓冲区,打印的内容可能不会立即显示。如果你希望实时显示打印的内容,可以在 print 函数中添加 flush=True 参数,它会立即刷新缓冲区。

在重定向输出到文件的情况下,你还需要确认文件也是即时写入的。可以通过设置文件的缓冲区为行缓冲(即每次写入一行内容后立即刷新缓冲区),将其打开模式设置为 'w'(写入模式)或 'a'(追加模式)并在后面加上一个 't'(文本模式)。

下面是一个修改后的例子:

import contextlib
import sys

def my_function():
    print('Hello, World!', flush=True)

with open('output.txt', 'w', buffering=1) as f:
    with contextlib.redirect_stdout(f):
        my_function()

在这个例子中,当运行 my_function 函数时,它的输出将实时打印到 'output.txt' 文件中。

Open函数, bufering 函数含义:

buffering设置为一个整数n > 0,则会创建一个大小为n的缓冲区,这表示每次读取或写入操作将处理n个字节。

  • 如果  buffering设置为1,就会选择行缓冲。这表示每次写入操作都将立即执行,但是每次读取操作只有在遇到新的行字符或者缓冲区满时才会执行。注意这只适用于文本模式,不适用于二进制模式。
  • 如果 buffering设置为负数或没有设置(默认为负数-1),文件将被完全缓冲。这是大多数类型文件的推荐模式。
  • 也就是说, buffering=n和 buffering=1的效果是不一样的。buffering=n会延迟写入,直到填满n个字节的缓冲区。而buffering=1则在每次写入新行时就立即写入文件。

在上面例子中,buffering=1就是为了开启行缓冲,使得每次调用print函数时,输出内容可以立即写入到文件中,而不用等待缓冲区满或者文件关闭时才进行写入。

猜你喜欢

转载自blog.csdn.net/abbcccdde/article/details/131485657
今日推荐