我正在尝试将函数的输出存储到Python中的文件中,我想要做的是这样的:
def test():
print("This is a Test")
file=open('Log','a')
file.write(test())
file.close()
但是当我这样做时,我收到了这个错误:
TypeError:参数1必须是字符串或只读字符缓冲区, 不是没有
PD:我正在尝试为无法修改的功能执行此操作。
答案 0 :(得分:6)
每当任何操作需要成对执行时,请使用上下文管理器。
在这种情况下,请使用contextlib.redirect_stdout
:
with open('Log','a') as f:
with contextlib.redirect_stdout(f):
test()
编辑:如果您想将其作为字符串,请使用io.StringIO
:
f = io.StringIO()
with contextlib.redirect_stdout(f):
test()
s = f.getvalue()
答案 1 :(得分:1)
您需要通过为标准输出分配实现write
方法的对象(如文件)来重定向标准输出。
import sys
def test():
print("This is a Test")
stdout_backup = sys.stdout
with open('Log', 'a') as f:
sys.stdout = f
test()
sys.stdout = stdout_backup
答案 2 :(得分:1)
您可以根据@o11c 答案定义装饰器:
def redirect_output_to_file(fname, overwrite=False):
def real_redirect_output_to_file(func):
def wrapper(*args, **kwargs):
import contextlib
with open(fname, 'w' if overwrite else 'a') as f:
with contextlib.redirect_stdout(f):
retval = func(*args, **kwargs)
return retval
return wrapper
return real_redirect_output_to_file
然后在任何函数上使用它:
@redirect_output_to_file('test_output.log')
def test():
print('Hi')
答案 3 :(得分:0)
解决方案1:
您应该使用日志记录来执行此操作,而不是使用print:
import logging
logger = logging.getLogger('myapp')
hdlr = logging.FileHandler('/tmp/myapp.log')
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
def test():
logger.info("This is a Test")
test()
上面的代码工作正常,你可以使用它。 PS:检查文件/tmp/myapp.log
中的输出解决方案2:
只需在命令行中运行代码,并将所有输出存储到文件'text.log'
中python main.py >> text.log
解决方案3:
import contextlib
from contextlib import ExitStack
def test():
print('hello world')
with ExitStack() as stack:
f = stack.enter_context(open('Log', 'a'))
stack.enter_context(contextlib.redirect_stdout(f))
test()
print("I'm not logged")
答案 4 :(得分:0)
函数是否在同一个文件中? 因为这是你可以做这样的事情
解决方案 1:
int
给予
import sys
def test():
print("This is a test")
out = sys.stdout
with open("Log", "a") as output:
sys.stdout = output
test()
sys.stdout = out
文件中的内容,
[Program finished]
问题是该函数只打印,但不返回任何内容。 Python 3.4 添加了 https://docs.python.org/3/library/contextlib.html#contextlib.redirect_stdout,它允许您将标准输出重定向到文件:
解决方案 2:
This is a test
This is a test
PS C:\Users\tan\Desktop> cat stdout.py
def test():
print("This is a Test")
from contextlib import redirect_stdout
with open('stdout.txt', 'w') as f:
with redirect_stdout(f):
test()
print('stdout in console again')