print方法输出到其它地方
导入 sys 模块并使用 sys.stdout:
import sys
sys.stdout.write("Hello, world!\n") # 输出和 print("Hello, world!") 相同
重定向标准输出到文件:
import sys
# 打开文件以写入模式
with open("output.txt", "w") as f:
# 将标准输出重定向到文件
sys.stdout = f
print("This will be written to the file instead of the console.")
# 恢复标准输出
sys.stdout = sys.__stdout__
print("This will appear in the console again.")
捕获 print() 的输出内容: 可以使用 io.StringIO 作为临时的 stdout,实现捕获输出的功能。
import sys
from io import StringIO
# 创建 StringIO 对象
output = StringIO()
sys.stdout = output
# 执行一些打印操作
print("Hello, captured output!")
# 获取输出内容
sys.stdout = sys.__stdout__ # 恢复标准输出
captured_text = output.getvalue() # 获取 StringIO 中的内容
print("Captured:", captured_text)
将print内容打印到终端的同时也输出到文件中的巧妙方法:
import sys
import atexit
from datetime import datetime
class DualOutput:
def __init__(self, file_path):
self.terminal = sys.stdout # 保存原来的标准输出
self.log = open(file_path, "a") # 打开文件,追加写入模式
self.new_line = True # 标记是否为新行
def write(self, message):
# 如果是新行,在输出内容前添加时间戳
if self.new_line:
timestamp = datetime.now().strftime("[%Y-%m-%d %H:%M:%S] ")
self.terminal.write(timestamp)
self.log.write(timestamp)
# 写入内容到控制台和文件
self.terminal.write(message)
self.log.write(message)
# 检查是否为换行符
self.new_line = message.endswith("\n")
def flush(self):
# 刷新输出缓冲区(在需要实时输出时很有用)
self.terminal.flush()
self.log.flush()
def close(self):
# 关闭文件
self.log.close()
# 使用自定义的 DualOutput 类
output = DualOutput("output.log")
sys.stdout = output # 重定向 sys.stdout 到 DualOutput
# 程序结束时自动关闭 log 文件
atexit.register(output.close)
# 测试输出
print("This will be written to both the console and the file.")
print("Another line to test.")
# 恢复原来的标准输出
sys.stdout = sys.stdout.terminal