Python 上下文管理器:控制輸出的結果能同時儲存到檔案中

IamJohnRain發表於2019-03-12

說明

以下這個類print_and_save可以修飾你的函式或管理上下文,讓你的函式或命令的輸出結果在控制檯輸出的同時,還能儲存為你指定的檔案
免去你是用寫日誌函式的必要

優點:

  • 完全不需要修改程式碼對函式或語句直接裝飾或通過上下文管理即可,見下面例子

此內容為個人原創,轉載請註明出處:

import sys

class print_and_save(object):
    def __init__(self, filepath):
        self.file = open(filepath, 'a')
        self.old = sys.stdout  # 將當前系統輸出儲存到臨時變數
        sys.stdout = self

    def __enter__(self):
        pass

    def __call__(self,func):
        def wrapper(*args, **kwargs):
            frs = func(*args, **kwargs)
            self._exit()
            return frs
        return wrapper

    
    def write(self, message):
        self.old.write(message)
        self.file.write(message)

    def flush(self):
        self.old.flush()
        self.file.flush()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self._exit()

    def _exit(self):
        self.file.flush()
        self.file.close()
        sys.stdout = self.old

方法1. 直接裝飾print函式

with print_and_save("a.txt"):  
    print("directed print")

方法2. 裝飾使用者函式

@print_and_save("a.txt")  
def decorated_out():
    print("decorator print")

decorated_out()

方法3. 定義使用者函式上下文方式

def contextout(text):
    print("context function print is %s" % text)

with print_and_save("a.txt"):  
    contextout("ok")

結果

# 控制檯
directed print
decorator print
context function print is ok

# 檔案a.txt內容
directed print
decorator print
context function print is ok

此內容為個人原創,轉載請註明出處:
https://blog.csdn.net/u011173298/article/details/88423504
https://www.cnblogs.com/JohnRain/p/10089419.html

相關文章