【问题标题】:python3 print to stringpython3打印到字符串
【发布时间】:2017-02-10 21:47:33
【问题描述】:

使用 Python 3,我有一个要移植到 GUI 的控制台应用程序。该代码有一堆打印语句,如下所示:

print(f1(), f2(), f3(), sep=getsep(), end=getend())

我想将这些调用转换为:

GuiPrintLine(f1(), f2(), f3(), sep=getsep(), end=getend())

最终使用某些(未定义的)GUI 框架呈现每一行。

如果我可以将要打印的参数转换为 print 通常会产生的字符串,而没有实际打印到 sysout 的副作用,那么这很容易做到。换句话说,我需要一个这样的函数:

s = print_to_string(*args, **kwargs)

如何将 print(...) 的一组参数格式化为一个字符串,该字符串产生的输出与 print() 产生的输出相同?

我意识到我可以通过将所有 args 与 sep 和 ends 连接起来来模拟 print,但如果有内置解决方案,我更愿意使用它。

使用打印和重定向 sysout 没有吸引力,因为它需要修改应用程序的全局状态,并且 sysout 可能同时用于其他诊断。

这似乎在 Python 中应该是微不足道的,所以也许我只是遗漏了一些明显的东西。

感谢您的帮助!

【问题讨论】:

  • 我不完全确定我是否理解 100%,但 ''.join(args) 是否满足您的需求?
  • 有点,但我不想假设任何关于 sep/end 的内容或存在的事情。我一直在想这样的事情可能会奏效:kwargs['sep'].join(*args, kwargs[end]),但处理可能缺少 sep/end 会很复杂。
  • printGuiPrintLine 有什么区别?
  • sep.join(args) + end 似乎是最好的解决方案。
  • 我想这还不清楚,如果你说你实际上并不想要 print 会产生的输出,你想在这里完成什么?

标签: python string python-3.x stringio


【解决方案1】:

通过字符串 io 找到答案。有了这个,我不必模仿 Print 对 sep/end 的处理,甚至不必检查是否存在。

import io

def print_to_string(*args, **kwargs):
    output = io.StringIO()
    print(*args, file=output, **kwargs)
    contents = output.getvalue()
    output.close()
    return contents

【讨论】:

  • 我正要建议。您可以使用 .seek(0) 和 .truncate() 方法清除 StringIO 对象以供重用。
  • 除非我弄错了,否则这会在字符串末尾添加一个换行符;为避免这种情况,应将end 参数转发到print
  • @entonio,我相信 end 是通过 **kwargs 转发打印的,不是吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2019-06-11
  • 2021-05-21
  • 1970-01-01
相关资源
最近更新 更多