Подтвердить что ты не робот

Хороший способ сделать перенос длинных строк на новую строку?

В моем проекте у меня есть группа строк, которые считываются из файла. Большинство из них при печати в командной консоли превышают 80 символов и обертываются вокруг, выглядя уродливо.

Я хочу, чтобы Python читал строку, а затем проверяйте, имеет ли она более 75 символов. Если это так, разделите строку на несколько строк, а затем напечатайте один за другим в новой строке. Я также хочу, чтобы это было умным, а не прекращением полных слов. т.е. "The quick brown <newline> fox..." вместо "the quick bro<newline>wn fox...".

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

Какие методы я могу использовать для этого?

4b9b3361

Ответ 1

Вы можете использовать textwrap модуль:

>>> import textwrap
>>> strs = "In my project, I have a bunch of strings that are read in from a file. Most of them, when printed in the command console, exceed 80 characters in length and wrap around, looking ugly."
>>> print(textwrap.fill(strs, 20))
In my project, I
have a bunch of
strings that are
read in from a file.
Most of them, when
printed in the
command console,
exceed 80 characters
in length and wrap
around, looking
ugly.

help на textwrap.fill:

>>> textwrap.fill?

Definition: textwrap.fill(text, width=70, **kwargs)
Docstring:
Fill a single paragraph of text, returning a new string.

Reformat the single paragraph in 'text' to fit in lines of no more
than 'width' columns, and return a new string containing the entire
wrapped paragraph.  As with wrap(), tabs are expanded and other
whitespace characters converted to space.  See TextWrapper class for
available keyword args to customize wrapping behaviour.

Используйте regex, если вы не хотите объединять строку в другую строку:

import re


strs = """In my project, I have a bunch of strings that are.
Read in from a file.
Most of them, when printed in the command console, exceed 80.
Characters in length and wrap around, looking ugly."""

print('\n'.join(line.strip() for line in re.findall(r'.{1,40}(?:\s+|$)', strs)))

# Reading a single line at once:
for x in strs.splitlines():
    print '\n'.join(line.strip() for line in re.findall(r'.{1,40}(?:\s+|$)', x))

выход:

In my project, I have a bunch of strings
that are.
Read in from a file.
Most of them, when printed in the
command console, exceed 80.
Characters in length and wrap around,
looking ugly.

Ответ 2

Это модуль textwrap. Попробуйте textwrap.fill(some_string, width=75).

Ответ 3

Это похоже на ответ Ашвини, но не использует re:

lim=75
for s in input_string.split("\n"):
    if s == "": print
    w=0 
    l = []
    for d in s.split():
        if w + len(d) + 1 <= lim:
            l.append(d)
            w += len(d) + 1 
        else:
            print " ".join(l)
            l = [d] 
            w = len(d)
    if (len(l)): print " ".join(l)

Выход, когда ваш вопрос задан:

In my project, I have a bunch of strings that are read in from a file.
Most of them, when printed in the command console, exceed 80 characters in
length and wrap around, looking ugly.

I want to be able to have Python read the string, then test if it is over
75 characters in length. If it is, then split the string up into multiple
strings, then print one after the other on a new line. I also want it to be
smart, not cutting off full words. i.e. "The quick brown <newline> fox..."
instead of "the quick bro<newline>wn fox...".

Ответ 5

string, max_width = input(), int(input())
result = wrap(string, max_width)
print(result)

def wrap(string, max_width):
    s=''
    for i in range(0,len(string),max_width):
        s=s+string[i:i+max_width]
        s=s+'\n'
    return s