Выходная строка, похожая на газетную статью в Python - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь вывести строку в консоли, чтобы при фиксированной длине строки она обрезалась и продолжала строку в новой строке - чтобы придать строке вид газетной статьи.

Это, я достиг. Однако я хочу реализовать систему, чтобы слова не были обрезаны посередине, нарушая процесс чтения.Вместо этого я хотел бы, чтобы дефис вставлялся в конце строки.

Это вывод, который у меня сейчас есть:

Picture link

Это вывод, который я хочуесть:

Picture link

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

if(outStr[i+1] == " "):

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

Это код, который я написал на Python 3.6.5:

lorumIpsum = "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source."

def OutputStringToBook(outStr):
    # Take each character
    for i in range(len(outStr)):
        # If the character is at the designated line end
        if (i % 30 == 0):
            # If the next character is not a space
            if(outStr[i+1] != " "):
                print()
            else:
                print("-") 
            print(outStr[i], end="")
        else:
            print(outStr[i], end="")
    #time.sleep(0.01)
OutputStringToBook(lorumIpsum)

Ответы [ 3 ]

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

Несмотря на то, что это прямой ответ, я расширяю ответ Prune некоторыми исправлениями вашего кода:

Идея состоит в том, чтобы удалить ненужные отпечатки и сделать их более четкими.

lorumIpsum = "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source."
def OutputStringToBook(outStr):
    # Take each character
    for i, item in enumerate(outStr):
        # If the character is at the designated line end
        if (i % 30 == 0):
            # If the current or next character is not a space
            if(item == " " or outStr[i+1] == " "):
                print("-", end='')
            print()
        print(item, end='')

OutputStringToBook(lorumIpsum)
0 голосов
/ 17 октября 2018

Чтобы это выглядело как газета, вы должны использовать правильный алгоритм переноса слов.Библиотека PyHyphen включает словари переносов, используемые в libreoffice, и поддерживает несколько языков (язык по умолчанию en_US).

# pip install pyhyphen
from hyphen import Hyphenator
from textwrap2 import wrap
english = Hyphenator('en_US')
print('\n'.join(wrap(lorem_text, width=20, use_hyphenator=english)))

Вывод будет выглядеть следующим образом.Обратите внимание, что некоторые строки короче 20 символов.Дефисы используются только в длинных словах и соответствуют языковым правилам переноса слов.

Contrary to popular
belief, Lorem Ipsum
is not simply random
text. It has roots
in a piece of clas-
sical Latin litera-
ture from 45 BC,
making it over 2000
years old.
0 голосов
/ 17 октября 2018

Ваш код ставит тире в конце каждой строки, потому что, как это происходит, каждый (30n + 1) -й символ является непустым.Прежде всего, вы хотите использовать дефисы только , когда два символа строки не являются пробелами:

if(outStr[i] == " " or outStr[i+1] == " "):

Теперь эта проблема по-прежнему связана с проблемой вставки дефисовбез учета фактических слоговых делений, и вы не выбрасываете пробелы на полях:

Contrary to popular belief, Lo-
rem Ipsum is not simply random
 text. It has roots in a piece
 of classical Latin literature
 from 45 BC, making it over 20-
00 years old. Richard McClinto-
ck, a Latin professor at Hampd-
en-Sydney College in Virginia,
 looked up one of the more obs-
cure Latin words, consectetur,
 from a Lorem Ipsum passage, a-
nd going through the cites of -
the word in classical literatu-
re, discovered the undoubtable

Если вы хотите удалить маргинальные пробелы, вам нужно проделать дополнительную работу: не печатать пробелыот вашего счетчика позиций, который предполагает, что вы захотите работать со строкой, которую вы потребляете 30 или 31 символ на строку (в зависимости от удаления пробела).Для «интеллектуального» выбора дефиса требуется словарь переносов (да, такая вещь существует) и дополнительная обработка.Кроме того, для адаптации к менее чем 30 символам, доступным для строки, необходимо вставить пробелы в строке, например, изменить

rem Ipsum is not simply random
text. It has roots in a piece

на

rem Ipsum is not simply random
text.  It has roots in a piece

Это потребует некоторой дополнительной обработки ...если это стоит усилий для ваших нужд.

...