我知道如何将打印重定向到文件.
import sys
orig_stdout = sys.stdout
f = file('out.txt', 'w')
sys.stdout = f
for i in range(2):
print ('i = ', i)
sys.stdout = orig_stdout
f.close()
Run Code Online (Sandbox Code Playgroud)
我需要做同样的事情但是没有文件:将打印输出保存在字符串列表中.如何在Py3k中做到这一点?
编辑:我可以在中间部分进行第三方打印,而不是我自己的打印,因此代码必须是通用的"print()".
unu*_*tbu 14
import sys
class ListStream:
def __init__(self):
self.data = []
def write(self, s):
self.data.append(s)
sys.stdout = x = ListStream()
for i in range(2):
print ('i = ', i)
sys.stdout = sys.__stdout__
print(x.data)
Run Code Online (Sandbox Code Playgroud)
产量
['i = ', ' ', '0', '\n', 'i = ', ' ', '1', '\n']
Run Code Online (Sandbox Code Playgroud)
提示:您无需保存原件 sys.stdout
orig_stdout = sys.stdout
Run Code Online (Sandbox Code Playgroud)
因为sys.stdout可以重置
sys.stdout = sys.__stdout__
Run Code Online (Sandbox Code Playgroud)
你也可以通过创建ListStream一个contextmanager来添加一些语法糖:
import sys
class ListStream:
def __init__(self):
self.data = []
def write(self, s):
self.data.append(s)
def __enter__(self):
sys.stdout = self
return self
def __exit__(self, ext_type, exc_value, traceback):
sys.stdout = sys.__stdout__
Run Code Online (Sandbox Code Playgroud)
通过添加__enter__和__exit__方法,你现在可以使用ListStream的with-statement,将自动重置sys.stdout为你当Python的退出with-suite:
with ListStream() as x:
for i in range(2):
print ('i = ', i)
print(x.data)
Run Code Online (Sandbox Code Playgroud)
而不是滚动你自己的类,我认为用你保留引用的实例替换sys.stdout(这只是一个TextIOWrapper)是最容易的StringIO:
import sys
from io import StringIO
s = StringIO()
sys.stdout = s
print('yo')
print('this is stuff')
print('hi')
s.getvalue()
Out[38]: 'yo\nthis is stuff\nhi\n'
s.getvalue().splitlines()
Out[39]: ['yo', 'this is stuff', 'hi']
Run Code Online (Sandbox Code Playgroud)
正如@unutbu所说,你可以恢复原来的标准输出sys.stdout = sys.__stdout__; 我特别喜欢使用上下文管理器暂时将stdout重定向到你想要的位置.
| 归档时间: |
|
| 查看次数: |
8210 次 |
| 最近记录: |