Удалить последний символ в буфере стандартного вывода - PullRequest
0 голосов
/ 12 января 2019

В 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 становится частью вывода.

В качестве фона stdout входит в поток Apache NiFi (не в окно консоли). Я бы предпочел использовать стандартный вывод, а не вторичный буфер в памяти, так как кажется, что это пустая трата памяти. Было бы здорово, если бы я мог удалить последний байт буфера stdout перед сбросом.

EDIT : Некоторые люди в комментариях предполагают, что мое использование списочных пониманий - это не тот путь, и вместо этого запустите json.dumps в списке. Если у кого-нибудь есть пример, как использовать это и убедиться, что у последнего элемента нет запятой, пожалуйста, покажите его!

1 Ответ

0 голосов
/ 12 января 2019

Самое простое решение - просто сбросить весь список сразу:

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