печать длинной строки в Python 3 - PullRequest
0 голосов
/ 29 октября 2018

Я попробовал следующий код

s='Python is an interpreted high-level programming language for general-purpose programming. Created by Guido van Rossum and first released in 1991, Python has a design philosophy that emphasizes code readability, notably using significant whitespace. It provides constructs that enable clear programming on both small and large scales'
s1='Python features a dynamic type system and automatic memory management. It supports multiple programming paradigms, including object-oriented, imperative, functional and procedural, and has a large and comprehensive standard library'
print(s,end='\r')
print(s1)

Вывод, который я получил,

Python is an interpreted high-level programming language for general-purpose programming. Created by Guido van Rossum and first released in 1991, Python has a design philosophy that emphasizes code readability, notably using significant whitespace. It provides con
Python features a dynamic type system and automatic memory management. It supports multiple programming paradigms, including object-oriented, imperative, functional and procedural, and has a large and comprehensive standard library

Первая строка s печатается в две строки. \r затем печатает вторую строку с начала 2-й строки.

Я хотел, чтобы вторая строка печаталась с начала первой строки. Можно ли это сделать с помощью print или мне следует использовать другие функции?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Это сложно. Прежде всего, не все терминалы имеют одинаковые возможности. Например, \033[s и \033[r, о которых говорил Ли Райан, не работают на моем терминале. Безопаснее читать контрольные последовательности из базы данных терминала:

import os
sc = os.popen('tput sc').read()
rc = os.popen('tput rc').read()
print(sc + s, end='\r')
print(rc + s1, end='\r')

Однако, это не будет работать в Windows. Кроме того, он просто сохраняет координаты курсора в поле зрения, а не в истории прокрутки; поэтому, если вы сохраните курсор на последней строке, напечатаете что-то, прокручивающее экран и восстановите курсор, вы вообще не будете двигаться (как он вернется к - последней строке!)

Обходной путь, который я предлагал в комментариях, заключается в следующем:

import os
columns = int(os.popen('tput cols').read())
need_for_up = (len(s) - 1) // columns
cuu = os.popen('tput cuu %s' % need_for_up).read()
print(s, end='\r' + cuu)
print(s1)

Поскольку это не работает с координатами, но фактически перемещает курсор вверх от его положения, оно работает как внизу, так и нет.

Так как это также запрашивает базу данных Terminfo с использованием tput, она также не будет работать в Windows. Будет ли это работать, если вы жестко закодируете cuu = "\033[%sA" % need_for_up, я не знаю (не в Windows).

0 голосов
/ 29 октября 2018

Это особенность эмулятора терминала, который вы используете. Да, вы можете использовать print, чтобы сделать это, вам нужно вывести соответствующую управляющую последовательность терминала для вашего типа терминала.

Например, если вы находитесь в xterm-подобном терминальном эмуляторе, escape-последовательность описана здесь (эта страница предназначена для bash, но у python был очень похожий синтаксис). Последовательность перехода, которая вас, вероятно, больше всего заинтересует:

  • Сохранить позицию курсора: \ 033 [с
  • Восстановление позиции курсора: \ 033 [u

Если вы делаете что-то более сложное, вам, вероятно, также будет интересна библиотека curses .

...