删除标准缓冲区中的最后一个字符

时间:2019-01-12 00:47:58

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

在Python 3.7中,我试图将一个JSON数组写入stdout,我想删除该数组中的最后一个逗号

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流程(而不是控制台窗口)。我宁愿使用stdout而不是辅助的内存中缓冲区,因为那样感觉就像浪费内存。如果能在刷新之前删除stdout缓冲区的最后一个字节,那就太好了。

编辑: 评论中的一些人建议我不要使用列表理解,而是在列表上运行json.dumps。如果有人举了一个例子来说明如何使用它,并确保最后一个元素没有尾随逗号,请显示它!

1 个答案:

答案 0 :(得分:3)

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

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("]")