2015-02-18 5 views
1

Я хотел бы каким-то образом добавить print() в строку или внутренний буфер вместо stdout в Python.Внутренний буферизованный вывод Python

В идеале, я мог бы напечатать это, а затем вывести строку на консоль так, как если бы она была напечатана на stdout для начала. Что-то вроде:

>>> print("output 1", a) 
>>> print("output 2", a) 
>>> print(a) 
output 1 
output 2 

Если вам интересно, что я делаю это ради быстрого рефакторинга на код, который ранее напечатанной непосредственно на консоль.

+0

Вы хотите использовать печать, чтобы сохранить ее в переменной вместо отображения ее на консоль ??? – Hackaholic

+1

Вы хотите перенаправить 'stdout'. См. Это сообщение http://stackoverflow.com/questions/1218933/can-i-redirect-the-stdout-in-python-into-some-sort-of-string-buffer – Cfreak

+0

Вы также можете просто использовать обычный файл и искать перед печатью без необходимости импорта –

ответ

0

StringIO действует как виртуальный файл и может быть использован для этой цели, но вы должны быть осторожны, чтобы получить информацию о поведении вы описали:

>>> import io 
>>> a = io.StringIO('') 
>>> print("output 1", file=a) 
>>> print("output 2", file=a) 
>>> print(a.getvalue()) # notice the extra new line at the end... 
output 1 
output 2 

>>> print(a.getvalue(), end='') # use end='' to suppress extra new line 
output 1 
output 2 
>>> print(a) # print(a) will not yield the same results 
<_io.StringIO object at 0x7fe3a23568b8> 
>>> print("output 3", a) # make sure to use "file=", or it will print str(a)! 
output 3 <_io.StringIO object at 0x7fe3a23568b8> 
>>> 
1

Что вы ищете является StringIO модулем.

Вы просто использовать его таким образом:

import StringIO 

a= StringIO.StringIO() 
a.write('output 1\n') 
print >>a, 'output 2' 

# Retrieve file contents -- this will be 
# 'output 1\noutput 2\n' 
contents = a.getvalue() 

# Close object and discard memory buffer -- 
# .getvalue() will now raise an exception. 
a.close() 

# will output 'output 1\noutput 2\n' 
print contents 

EDIT: Я не видел ответа Джоша перед отправкой моей. Его синтаксис для Python 3 шахта для старых Python 2.x

+0

Я пропустил флажок «ответить на свой вопрос», мой плохой. – jtpereyda

+0

Печать 'a' будет печатать' StringIO.StringIO экземпляр в ... ' –

0

В общем, метод print() принимает редко используемый параметр, file, который просто должен быть «как файлы» (по умолчанию это стандартный вывод) , Из документа:

Аргумент файла должен быть объектом с методом write(string); если он отсутствует или None, будет использоваться sys.stdout. Буферизация вывода определяется файлом. Используйте file.flush() для обеспечения, например, немедленного появления на экране.

Вы могли бы обеспечить свою собственную реализацию буферной или использовать StringIO как файл-как, если вы хотите сохранить синтаксис print.

Смежные вопросы