Zacharia2 / SuperMemo-Toolkit

SuperMemo 增强工具(CLI命令行)。包含图链整理、EPUB图书转换导入、Latex公式转图片等。
GNU General Public License v2.0
24 stars 3 forks source link

总结功能函数 #23

Closed Zacharia2 closed 6 months ago

Zacharia2 commented 7 months ago

希望提供一个函数,替换print函数,但,打印是在最后输出的信息。

Zacharia2 commented 7 months ago

如果你使用Python的logging模块,并且不希望即时打印到控制台,你可以自定义一个日志处理器(Handler),将日志消息收集到一个列表中,然后通过一个函数来遍历并打印这些消息。 下面是一个示例,展示了如何实现这个功能:

import logging
# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)  # 设置日志级别
# 使用一个列表来收集日志消息
log_messages = []
# 自定义一个日志处理器,将日志消息添加到列表中
class LogCollectorHandler(logging.Handler):
    def emit(self, record):
        log_messages.append(self.format(record))
# 创建并添加自定义处理器到logger
collector_handler = LogCollectorHandler()
collector_handler.setLevel(logging.DEBUG)
logger.addHandler(collector_handler)
# 定义一个函数,用于稍后打印日志
def print_log_messages():
    for message in log_messages:
        print(message)
# 记录一些日志
logger.debug('这是一个debug信息')
logger.info('这是一个info信息')
logger.warning('这是一个warning信息')
logger.error('这是一个error信息')
logger.critical('这是一个critical信息')
# 调用函数打印日志
print_log_messages()

在这个例子中,我们定义了一个自定义处理器LogCollectorHandler,它继承自logging.Handler。这个处理器的emit方法将被调用以处理每条日志消息,我们将消息格式化后添加到一个列表中。 然后,我们创建了一个LogCollectorHandler实例,并将其添加到logger中。这样,当logger记录日志时,自定义处理器的emit方法将被调用,日志消息将被收集到列表中。 最后,我们定义了一个print_log_messages函数,它遍历收集到的日志消息并打印它们。你可以在任何需要的时候调用这个函数来输出日志。 这种方法的好处是,它允许你在记录日志和实际打印日志之间有一个延迟,这样你可以控制日志输出的时机。同时,它也保持了使用logging模块的其他好处,比如日志级别的控制。

Zacharia2 commented 7 months ago

在程序执行期间收集日志信息,然后在程序的最后统一输出 py logging

如果你想要在程序执行期间收集日志信息,然后在程序的最后统一输出,你可以使用logging模块的BufferingFormatter类来缓存日志消息,并在需要时一次性输出所有缓存的消息。下面是一个简单的例子:

import logging
from logging.handlers import BufferingHandler
class CollectingHandler(BufferingHandler):
    def __init__(self, capacity):
        super(CollectingHandler, self).__init__(capacity)
    def shouldFlush(self, record):
        # 不立即刷新,只在手动调用flush()时输出
        return False
    def emit(self, record):
        # 实现父类的emit方法,将记录存储到内部的缓冲区
        super(CollectingHandler, self).emit(record)
def output_collected_logs(handler):
    # 获取缓存的日志消息并输出
    for record in handler.buffer:
        print(handler.format(record))
# 创建一个收集日志的处理器
collecting_handler = CollectingHandler(capacity=100)
# 配置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
collecting_handler.setFormatter(formatter)
# 创建一个日志记录器,并添加收集日志的处理器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.INFO)
logger.addHandler(collecting_handler)
# 程序的其他部分,记录日志
logger.info("这是第一条日志信息。")
logger.info("这是第二条日志信息。")
# 在程序的最后,输出收集到的日志信息
output_collected_logs(collecting_handler)

在这个例子中,我们定义了一个CollectingHandler类,它继承自BufferingHandler。这个处理器的目的是缓存所有接收到的日志记录,直到我们决定输出它们。我们重写了shouldFlush方法,使其始终返回False,这样日志就不会立即刷新输出。 然后,我们定义了一个output_collected_logs函数,它接受一个CollectingHandler实例作为参数,并遍历其内部缓冲区中的所有日志记录,将它们格式化后输出。 在程序的最后,我们调用output_collected_logs函数来输出所有收集到的日志信息。这种方法允许你在程序执行期间收集日志信息,并在需要时统一输出。

Zacharia2 commented 6 months ago
import hashlib

filename = input("Enter the file name: ")
md5_hash = hashlib.md5()
with open(filename,"rb") as f:
    # Read and update hash in chunks of 4K
    for byte_block in iter(lambda: f.read(4096),b""):
        md5_hash.update(byte_block)
    print(md5_hash.hexdigest())
这是上面的程序是动作,

python3 md5hash2.py
输入文件名:md5hash2.py
0101ae2ac06b8a52154100e37d8bafea

im-SHA1作为文件名。

Zacharia2 commented 6 months ago

请求文件名