【问题标题】:Delete last character in stdout buffer删除标准输出缓冲区中的最后一个字符
【发布时间】:2019-01-12 00:47:58
【问题描述】:

在 Python 3.7 中,我正在尝试将 JSON 数组写入标准输出,并且我想删除数组中的最后一个逗号

sys.stdout.write("[")
[sys.stdout.write(json.dumps(x, separators=(',', ': ')) + ",") for x in list]
sys.stdout.write("\b]")  # I want to remove the final ',' from above.

我知道sys.stdout 已缓冲,所以我想做的是在刷新之前删除该缓冲区中的最后一个字符。唯一的问题是我不知道如何正确访问该缓冲区以及确保不写入最后一个字节。

我弄乱了\b 字符,但它什么也没做,所发生的只是\b 字符成为输出的一部分。

作为背景,标准输出将进入 Apache NiFi 流(而不是控制台窗口)。我更愿意使用标准输出而不是辅助内存缓冲区,因为这感觉像是在浪费内存。如果我能在刷新之前删除标准输出缓冲区的最后一个字节,那就太好了。

编辑: cmets 中的一些人建议我不要使用列表推导,而是在列表上运行json.dumps。如果有人有一个如何使用它的示例并确保最后一个元素没有尾随逗号,请展示它!

【问题讨论】:

  • 为什么不直接在list 上使用json.dumps,而不是用这种有点麻烦的方式构造输出?
  • 输出缓冲无论如何都不是那样工作的,担心额外的内存缓冲区是过早的优化,特别是如果您不完全了解正常缓冲的工作原理。
  • (另外,担心额外的缓冲然后丢弃列表的内存以滥用列表理解以产生副作用是相当愚蠢的。)

标签: python python-3.x buffer stdout apache-nifi


【解决方案1】:

最简单的解决方案是一次转储整个列表:

sys.stdout.write(json.dumps(list, separators=(',', ': '))

但如果你真的需要单独编写每个元素,你可以使逗号成为条件:

last_index = len(list) - 1
sys.stdout.write("[")
for i, x in enumerate(list):
    sys.stdout.write(json.dumps(x, separators=(',', ': '))
    if i < last_index:
        sys.stdout.write(',')
sys.stdout.write("]")

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2023-03-23
    • 2020-08-15
    • 1970-01-01
    相关资源
    最近更新 更多