it-swarm.com.de

Ein guter Weg, um lange Zeichenketten in Zeilenumbrüche umzuwandeln?

In meinem Projekt gibt es eine Reihe von Zeichenfolgen, die aus einer Datei eingelesen werden. Die meisten von ihnen sind in der Befehlskonsole mehr als 80 Zeichen lang und werden hässlich umbrochen.

Ich möchte Python lesen und dann testen, ob die Zeichenfolge mehr als 75 Zeichen lang ist. Wenn dies der Fall ist, teilen Sie die Zeichenfolge in mehrere Zeichenfolgen auf und drucken Sie eine nach der anderen andere in einer neuen Zeile. Ich möchte auch, dass es klug ist und keine vollständigen Wörter abschneidet, dh "The quick brown <newline> fox..." statt "the quick bro<newline>wn fox...".

Ich habe versucht, ähnlichen Code zu ändern, der die Zeichenfolge nach einer festgelegten Länge abschneidet, aber nur die Zeichenfolge abschneidet, anstatt sie in eine neue Zeile zu setzen.

Mit welchen Methoden könnte ich dies erreichen?

32
Joshua Merriman

Sie könnten das textwrap Modul verwenden:

>>> 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.

Hilfe zu 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.

Verwenden Sie regex, wenn Sie eine Zeile nicht in einer anderen Zeile zusammenführen möchten:

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))

Ausgabe:

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.
62

Dafür gibt es das textwrap Modul. Versuchen Sie textwrap.fill(some_string, width=75).

11
jwodder

Dies ähnelt der Antwort von Ashwini, verwendet jedoch nicht 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)

Ausgabe wenn die Eingabe Ihre Frage ist:

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...".
4
perreal
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
0
pawan kumar