@NLegion

Python. выравнивание текста по ширине, как улучшить?

Задача: выравнивание текста по ширине
1. ввод текста произвольной длины (до 1к символов) через stdin
2. ввод ширины текстовой колонки (от 1 до 80)
3. форматирование текста по ширине по указанной ширине колонки
4. вывод отформатированного по ширине текста в stdout

- программа должна работать в терминале Linux
- программа должна быть разработана на языке C (возможна замена на язык С++, либо на Python).
- программа должна быть разработана в структурном стиле
- при наличии на строке единственного слова, при этом превышающего допустимую ширину - оставлять на строке это единственное слово

мое решение:
with open('file3.txt','r',encoding="utf-8") as inf:
    for line in inf:
        line = line.strip()
z = 0
for item in line:
    z += 1
    print(item,end='')
    if (z >= 80) & (item == ' '):
        z = 0
        print('\r')


думаю, что можно сделать лучше (через генератор или срезы), но пока ничего в голову не лезет)
Прошу Вашего мнения
  • Вопрос задан
  • 1649 просмотров
Решения вопроса 1
@Drill
text = 'Lorem ipsum dolor sit amet, 1234567890123456789012345678901234567890, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'

from textwrap import wrap

def justify(line, width):
    gap_width, max_replace = divmod(width - len(line) + line.count(' '), line.count(' '))
    return line.replace(' ', ' ' * gap_width).replace(' ' * gap_width, ' ' * (gap_width + 1), max_replace)

def lines_formatter(text, width):
    lines = wrap(text, width, break_long_words=False)
    for i, line in enumerate(lines[:-1]):
        if len(line) <= width and line.count(' '):
            lines[i] = justify(line, width).rstrip()
    return '\n'.join(lines)


print(lines_formatter(text, 80))

In [17]:
Lorem    ipsum   dolor   sit   amet,   1234567890123456789012345678901234567890,
consectetur  adipisicing  elit,  sed  do  eiusmod tempor incididunt ut labore et
dolore magna aliqua.


print(lines_formatter(text, 35))

In [18]:
Lorem   ipsum   dolor   sit   amet,
1234567890123456789012345678901234567890,
consectetur  adipisicing  elit, sed
do  eiusmod  tempor  incididunt  ut
labore et dolore magna aliqua.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@qid00000000
Мало что знаю, но информацию найду в гугле
path_to_file = 'test.txt'

# генератор, за раз читаем по line_length
def read(text_file: str, line_length: int = 80):
    with open(text_file, 'r', encoding='utf-8') as text:
        line = None
        while line != '':
            line = text.read(line_length)
            yield line

def print_by_width(text_file, line_length):
    for row in read(text_file, line_length):
        print(row)

print_by_width(path_to_file, 80)


У меня как-то так получилось. Можно переделать генератор, чтобы вывод был таким, какой нужен (например, удалить переносы строки и пр..).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы