【问题标题】:How to flush Python IO Stream如何刷新 Python IO 流
【发布时间】:2020-03-20 10:47:57
【问题描述】:
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

【问题讨论】:

标签: python iostream


【解决方案1】:

创建一个new StringIO 而不是截断和寻找。当你只是通过这个thread 时,在Python 3 中创建一个新的流而不是重用一个空白流是11% 更快并且创建一个新的而不是重用包含3KB 数据的流的速度提高了 5%。

【讨论】:

  • 是的,这是真的,但是你浪费的内存呢。
  • 该链接明确指出“忽略潜在的内存问题”,无论我们以何种方式关闭旧流并创建新流。
  • 好的,但我必须重用流,这就是为什么截断是谷歌云平台上对我来说最好的选择。
【解决方案2】:

您可以使用函数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) 使用起始位置。因为您已经在 before truncate(0) 中指定了 seek(0),所以在截断之前将位置切换到句子的开头。下面的示例应该会为您解决问题。

  • 使用seek(10)truncate()

  • 使用seek(0)truncate()

【讨论】:

  • 这个string_out.truncate()和这个string_out.turncate(0)有什么区别
  • 更新了我的答案。希望对您有所帮助
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2012-11-16
    • 2010-11-25
    相关资源
    最近更新 更多