центрировать многострочный текст в выводе Python - PullRequest
0 голосов
/ 10 мая 2018

ОК, так что это кажется очень простым вопросом, но я нигде не могу найти действенный ответ, так что вот так.

У меня есть текст:

text = '''
Come and see the violence inherent in the system. Help! Help! I'm being 
repressed! Listen, strange women lyin' in ponds distributin' swords is no 
basis for a system of government. Supreme executive power derives from a 
mandate from the masses, not from some farcical aquatic ceremony. The Lady 
of the Lake, her arm clad in the purest shimmering samite held aloft 
Excalibur from the bosom of the water, signifying by divine providence that 
I, Arthur, was to carry Excalibur. THAT is why I am your king.'''

Не содержит разрывов строк или другого форматирования. Я хочу обернуть свой текст, чтобы он правильно отображался в окне вывода ipython при запуске кода. Я также хочу, чтобы он был в центре, и немного короче, чем полная ширина окна (80 символов)

Если бы у меня была короткая текстовая строка (короче, чем длина строки), я мог бы просто вычислить длину строки и заполнить ее пробелами, чтобы она оказалась в центре, или использовать свойство text.center() для ее правильного отображения.

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

from textwrap import fill
print(fill(text, width=50))

и установите ширину, равную

Так что я бы подумал, что мог бы просто:

from textwrap import fill
wrapped_text = (fill(text, width=50))
print(wrapped_text.center(80))

но это не работает. Все еще оправдано.

Я уверен, что не могу быть единственным человеком, который пытался это сделать. Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Проблема в том, что center ожидает однострочную строку, а fill возвращает многострочную строку.

Ответ заключается в center каждой строке перед их соединением.

Если вы посмотрите на документы для fill, это сокращение для:

"\n".join(wrap(text, ...))

Итак, вы можете просто пропустить эту стенографию и использовать wrap напрямую. Например, вы можете написать свою собственную функцию, которая делает именно то, что вы хотите:

def center_wrap(text, cwidth=80, **kw):
    lines = textwrap.wrap(text, **kw)
    return "\n".join(line.center(cwidth) for line in lines)

print(center_wrap(text, cwidth=80, width=50))

Хотя, если вы делаете это только в одном месте, чтобы немедленно распечатать его, вероятно, проще даже не беспокоиться join:

for line in textwrap.wrap(text, width=50):
    print(line.center(80))
0 голосов
/ 10 мая 2018

wrapped_text - это список строк, поэтому обведите строки и расположите их по центру.

import textwrap

text = "Come and see the violence inherent in the system. Help! Help! I'm being repressed! Listen, strange women lyin' in ponds distributin' swords is no basis for a system of government. Supreme executive power derives from a mandate from the masses, not from some farcical aquatic ceremony. The Lady of the Lake, her arm clad in the purest shimmering samite held aloft Excalibur from the bosom of the water, signifying by divine providence that I, Arthur, was to carry Excalibur. THAT is why I am your king."    

wrapped_text = textwrap.wrap(text)
for line in wrapped_text:
    print(line.center(80))
...