標籤:

Python控制台輸出並同時保存到文件

Python控制台輸出並同時保存到文件

寫代碼時候經常使用print輸出到控制台,實際上print本質上是調用sys.stdout.write

但是一般我們寫較複雜的程序時,常常需要將控制台的輸出保存為日誌以便分析程序運行情況。

這樣一來我們就需要將sys.stdout重定向到文件中啦。

我們直接用貼上面更清晰。

def mkdir_if_missing(dir_path): """ create folder Parameters ---------- dir_path : str folder path. Returns ------- """ try: os.makedirs(dir_path) except OSError as e: if e.errno != errno.EEXIST: raise

mkdir_if_missing 函數實現了創建文件的操作。

我們想要在控制台和文件都保證輸出,要先保存原始的stdout。

此外還需重寫write和flush。

正如print本質調用stdout.write一樣,如果該對象沒有write函數,實際運行會報錯找不到write函數。

flush在windows下應該是沒有明顯左右,在linux下能保證每次都輸出。

class Logger(object): def __init__(self, file_path): self.__console = sys.stdout self.__file = None if file_path is not None: mkdir_if_missing(osp.dirname(osp.abspath(file_path))) self.__file = open(file_path, w) def __exit__(self, *args): self.close() def __del__(self): self.close() def __enter__(self): pass def write(self, msg): self.__console.write(msg) if self.__file is not None: self.__file.write(msg) def flush(self): self.__console.flush() if self.__file is not None: # flush() does not necessarily write the file』s data to disk. # Use flush() followed by os.fsync() to ensure this behavior. # The os.fsync() need a parameter which can obtain by fileno(). self.__file.flush() os.fsync(self.__file.fileno()) def close(self): self.__console.close() if self.__file is not None: self.__file.close()if __name__ == __main__: sys.stdout = Logger(log.txt)

推薦閱讀:

美高M3微型投影儀為什麼上市成手持主流機型
獨孤問天下,這台科技全能洗衣機還有什麼不能洗?
中國北斗地圖APP下月上線
伺服器維護教程 軟硬體維護注意事項!
搜狗獲Cityscapes評測世界冠軍,多項指標刷新世界紀錄

TAG:科技 |