Как сбросить поток ввода-вывода Python

import io

string_out = io.StringIO()
string_out.write("hello")
print(string_out.getvalue())

string_out.write("new Hello")
print(string_out.getvalue())

OutPut1: hello 
OutPut2: hellonew Hello 

Как я могу сбросить свой первый ввод из потока, чтобы вывод второго потока стал просто новым Hello


person Ansar Ahmed    schedule 25.11.2019    source источник
comment
docs.python.org/3/library/io.html   -  person Veerendra Kakumanu    schedule 25.11.2019
comment
string_out.seek(0); string_out.truncate() сделал бы это   -  person Aran-Fey    schedule 25.11.2019


Ответы (3)


Вы можете использовать функцию truncate(). Он не удаляет поток, а изменяет его размер, поэтому присвоение ему значения 0 должно избавиться от всех байтов в потоке. Вам также нужно будет использовать seek() для изменения положения потока. Как и в случае с truncate(), присвоение ему значения 0 должно привести к смещению позиции к началу потока. Удачи!

import io

string_out = io.StringIO()
string_out.write("hello")
print(string_out.getvalue())
string_out.seek(0)
string_out.truncate(0)
string_out.write("new Hello")
print(string_out.getvalue())

Обновление: в чем разница между truncate(0) и truncate()?

truncate() использует текущую позицию по умолчанию, а truncate(0) использует начальную позицию. Поскольку вы уже указали seek(0) перед truncate(0), перед усечением позиция переключается на начало предложения. Приведенные ниже примеры должны прояснить это для вас.

  • Использование seek(10) и truncate():

введите здесь описание изображения

  • Использование seek(0) и truncate():

введите здесь описание изображения

person O Yahya    schedule 25.11.2019
comment
в чем разница между этим string_out.truncate() и этим string_out.turncate(0) - person Ansar Ahmed; 25.11.2019
comment
Обновил мой ответ. Надеюсь, это поможет - person O Yahya; 25.11.2019

getvalue получает всю строку, вы можете делать то, что ищете, ища и читая:

import io

string_out = io.StringIO()
string_out.write("hello")
string_out.seek(0)
print(string_out.read())
# hello
string_out.write("new Hello")
string_out.seek(0+len("hello"))
print(string_out.read())
# new Hellow
person oppressionslayer    schedule 25.11.2019

создайте new StringIO вместо усечения и поиска. Когда вы просто проходите через этот поток , в Python 3 создание нового потока вместо повторного использования пустого потока выполняется на 11% быстрее, а создание нового потока вместо повторного использования потока с 3KB данными выполняется на 5 % быстрее.

person redhatvicky    schedule 25.11.2019
comment
да, это правда, но как насчет памяти, которую вы тратите впустую. - person Ansar Ahmed; 25.11.2019
comment
В ссылке четко указано, что потенциальные проблемы с памятью игнорируются, в любом случае мы закрываем старый поток и создаем новый поток. - person redhatvicky; 25.11.2019
comment
хорошо, понял, но мне нужно повторно использовать поток, поэтому усечение - лучший доступный вариант для меня на облачной платформе Google. - person Ansar Ahmed; 25.11.2019