将打印重定向到字符串列表?

Pro*_*020 13 python

我知道如何将打印重定向到文件.

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__方法,你现在可以使用ListStreamwith-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)

  • 神圣的废话是背景管理者真的很容易建立?我觉得我一直在做错事...... (2认同)

roi*_*ppi 6

而不是滚动你自己的类,我认为用你保留引用的实例替换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重定向到你想要的位置.

  • 知道了 我仍然认为使用StringIO比滚动自己的类进行编辑更容易。 (2认同)