我正在编写代码来分析PDF文件。我想在控制台上显示输出以及在文件中包含输出的副本,我使用此代码将输出保存在文件中:
import sys
sys.stdout = open('C:\\users\\Suleiman JK\\Desktop\\file.txt',"w")
print "test"
但是我可以将输出显示到控制台中但不使用类,因为我对它们不好吗?
答案 0 :(得分:1)
sys.stdout
可以指向任何具有write方法的对象,因此您可以创建一个写入文件和控制台的类。
import sys
class LoggingPrinter:
def __init__(self, filename):
self.out_file = open(filename, "w")
self.old_stdout = sys.stdout
#this object will take over `stdout`'s job
sys.stdout = self
#executed when the user does a `print`
def write(self, text):
self.old_stdout.write(text)
self.out_file.write(text)
#executed when `with` block begins
def __enter__(self):
return self
#executed when `with` block ends
def __exit__(self, type, value, traceback):
#we don't want to log anymore. Restore the original stdout object.
sys.stdout = self.old_stdout
print "Entering section of program that will be logged."
with LoggingPrinter("result.txt"):
print "I've got a lovely bunch of coconuts."
print "Exiting logged section of program."
结果:
控制台:
Entering section of program that will be logged.
I've got a lovely bunch of coconuts.
Exiting logged section of program.
的Result.txt:
I've got a lovely bunch of coconuts.
在某些情况下,此方法可能比codesparkle更受欢迎,因为您不必将所有现有print
替换为logging.info
。只需将您想要的所有内容记录到with
块中即可。
答案 1 :(得分:0)
(这个答案使用Python 3,如果您更喜欢Python 2,则必须对其进行调整。)
首先导入Python logging
包(和sys
以访问标准输出流):
import logging
import sys
在您的入口点,标准输出流和输出文件的set up a handler:
targets = logging.StreamHandler(sys.stdout), logging.FileHandler('test.log')
和configure the logging package仅输出没有日志级别的消息:
logging.basicConfig(format='%(message)s', level=logging.INFO, handlers=targets)
现在你可以使用它了:
>>> logging.info('testing the logging system')
testing the logging system
>>> logging.info('second message')
second message
>>> print(*open('test.log'), sep='')
testing the logging system
second message
答案 2 :(得分:0)
你可以制作一个能够打印到控制台和文件的功能。您可以通过切换标准输出来实现,例如像这样:
def print_both(file, *args):
temp = sys.stdout #assign console output to a variable
print ' '.join([arg for arg in args])
sys.stdout = file
print ' '.join([arg for arg in args])
sys.stdout = temp #set stdout back to console output
或使用文件写入方法(我建议使用此方法,除非你必须使用stdout)
def print_both(file, *args):
toprint = ' '.join([arg for arg in args])
print toprint
file.write(toprint)
请注意:
...像这样:
print_both(open_file_variable, 'pass arguments as if it is', 'print!', 1, '!')
否则,您必须将所有内容都转换为单个参数,即单个字符串。它看起来像这样:
print_both(open_file_variable, 'you should concatenate'+str(4334654)+'arguments together')
我仍然建议你学会正确使用课程,你会从中受益。希望这会有所帮助。
答案 3 :(得分:0)
我懒得写一个函数,所以当我需要打印到控制台和文件时,我写了这个快速且(不是那么)脏的代码:
import sys
...
with open('myreport.txt', 'w') as f:
for out in [sys.stdout, f]:
print('some data', file=out)
print('some mre data', file=out)