web-dev-qa-db-fra.com

Une bonne façon de boucler de longues cordes sur la nouvelle ligne?

Dans mon projet, j'ai un tas de chaînes qui sont lues dans un fichier. La plupart d'entre eux, lorsqu'ils sont imprimés dans la console de commande, dépassent 80 caractères de long et s'enroulent, semblant moche.

Je veux pouvoir avoir Python lire la chaîne, puis tester si elle fait plus de 75 caractères. Si c'est le cas, diviser la chaîne en plusieurs chaînes, puis en imprimer une après la autre sur une nouvelle ligne. Je veux aussi qu'il soit intelligent, ne coupe pas les mots entiers. ie "The quick brown <newline> fox..." au lieu de "the quick bro<newline>wn fox...".

J'ai essayé de modifier un code similaire qui tronque la chaîne après une longueur définie, mais supprime simplement la chaîne au lieu de la mettre dans une nouvelle ligne.

Quelles méthodes pourrais-je utiliser pour y parvenir?

32
Joshua Merriman

Vous pouvez utiliser le module 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.

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

Utilisez regex si vous ne voulez pas fusionner une ligne dans une autre ligne:

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

sortie:

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

C'est à cela que sert le module textwrap . Essayez textwrap.fill(some_string, width=75).

11
jwodder

Ceci est similaire à la réponse d'Ashwini mais n'utilise pas 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)

Sortie lorsque l'entrée est votre question:

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