在 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函数时,输出内容可以立即写入到文件中,而不用等待缓冲区满或者文件关闭时才进行写入。