当前位置: 首页 > 面试题库 >

同时打印到屏幕和写入文件

徐涵亮
2023-03-14
问题内容

我在网上找到了一些通常可以使用的代码,但我想在同一程序中多次使用它(将不同的内容写入不同的文件,同时始终始终在屏幕上打印)。

也就是说,当它关闭时,我认为sys.stdout会关闭,因此完全无法打印,并且再次使用此类。我尝试重新导入sys和其他愚蠢的东西,但无法正常工作。

这是网站,以及代码groups.google.com/group/comp.lang.python/browse_thread/thread/d25a9f5608e473af/

import sys

class MyWriter:

    def __init__(self, stdout, filename):
        self.stdout = stdout
        self.logfile = file(filename, 'a')

    def write(self, text):
        self.stdout.write(text)
        self.logfile.write(text)

    def close(self):
        self.stdout.close()
        self.logfile.close()

writer = MyWriter(sys.stdout, 'log.txt')
sys.stdout = writer

print 'test'

问题答案:

您正在尝试重制很差的东西,而Python标准库却做得很好。请检查日志记录模块。

使用此模块,您可以按照简单,标准和可扩展的方式完全执行所需的操作。您可以按照以下步骤进行操作(此示例是日志记录手册的复制/粘贴):

假设您要使用不同的消息格式和在不同的情况下登录控制台和文件。假设您要记录DEBUG或更高级别的消息到文件,而INFO或更高级别的消息记录到控制台。我们还假设该文件应包含时间戳,但控制台消息不应包含时间戳。这是实现此目的的方法

import logging

# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger().addHandler(console)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')

运行此命令时,在控制台上,您将看到

root        : INFO     Jackdaws love my big sphinx of quartz.
myapp.area1 : INFO     How quickly daft jumping zebras vex.
myapp.area2 : WARNING  Jail zesty vixen who grabbed pay from quack.
myapp.area2 : ERROR    The five boxing wizards jump quickly.

在文件中,您将看到类似

10-22 22:19 root         INFO     Jackdaws love my big sphinx of quartz.
10-22 22:19 myapp.area1  DEBUG    Quick zephyrs blow, vexing daft Jim.
10-22 22:19 myapp.area1  INFO     How quickly daft jumping zebras vex.
10-22 22:19 myapp.area2  WARNING  Jail zesty vixen who grabbed pay from quack.
10-22 22:19 myapp.area2  ERROR    The five boxing wizards jump quickly.

如您所见,DEBUG消息仅显示在文件中。其他消息发送到两个目的地。

本示例使用控制台和文件处理程序,但是您可以使用任意数量和所选处理程序的组合。



 类似资料:
  • 我在写构建脚本。我想记录正在进行的一切,但我也想在它运行的时候看到一切。做这件事的最佳做法是什么?

  • 问题内容: 我有一个名为的文本文件,其内容如下: 这个 是 文本 我将如何在Java 7中将确切的文件打印到屏幕上? 问题答案: 在Java 7之前: 添加异常处理 添加关闭流 从Java 7开始,无需关闭流,因为它实现了

  • 问题内容: 我有一个可以捕获一些数据的Shell脚本。我想将结果打印到文件中,但是这样做会阻止结果显示在终端上。有没有办法既可以在屏幕上打印结果,又可以写入文件。提前致谢。 问题答案: 将输出通过管道传递给命令。 例: 请注意,标准输出已打印出来并写入thr 命令指定的文件中。

  • 已创建输出文件,但未写入数字。 程序应读取一个文件,然后创建一个输出文件,该文件反向打印输入文件中的数字。 实际结果只显示文件,但文件中没有写入任何内容。

  • 本文向大家介绍在SAP中使用VBA的打印屏幕,包括了在SAP中使用VBA的打印屏幕的使用技巧和注意事项,需要的朋友参考一下 如果您使用的是SendKeys,请避免使用它。我在过去的项目中使用过它,它似乎前后不一致且容易出错。 您可以在模块顶部使用以下代码段,并在需要时调用它。

  • 问题内容: 在终端中工作时,我看到了最后一个Shell命令执行输出的历史记录。如果运行vim,我会看到全屏打开的文件。退出vim时,我可以再次看到最后一个shell命令的历史记录。 但是,当我从屏幕上使用vim时。我在退出vim时看到的是刚刚编辑的文件的足迹,而不是最后一个shell命令的历史记录。 我想看看外壳的历史。 我该如何实现这种行为? 我用了: terminal.app和iterm2.a