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
posted @ 2024-10-27 13:55  RolandHe  阅读(6)  评论(0编辑  收藏  举报