Question

Je suis en train d'utiliser TextWrap pour formater un fichier d'importation qui est tout à fait particulière dans la façon dont il est formaté. Il est essentiellement la suivante (longueur de ligne raccourcie par souci de simplicité):

abcdef <- Ok line
abcdef 
 ghijk <- Note leading space to indicate wrapped line
 lm

Maintenant, j'ai le code obtenu au travail comme suit:

wrapper = TextWrapper(width=80, subsequent_indent=' ', break_long_words=True, break_on_hyphens=False)
for l in lines:
  wrapline=wrapper.wrap(l)

Cela fonctionne presque parfaitement, cependant, le code d'emballage texte ne fait pas une rupture difficile à la marque de 80 caractères, il essaie d'être intelligent et de briser un espace (à environ 20 caractères dans).

Je l'ai contourné ceci en remplaçant tous les espaces dans la liste de chaînes avec un caractère unique (#), les envelopper puis enlever le caractère, mais sûrement il doit y avoir un moyen plus propre?

N.B. Toutes les réponses possibles doivent travailler sur Python 2.4 - désolé

Était-ce utile?

La solution

Une version générateur peut être une meilleure solution pour vous, car il ne serait pas nécessaire de charger la chaîne entière en mémoire à la fois:

def hard_wrap(input, width, indent=' '):
   for line in input:
      indent_width = width - len(indent)
      yield line[:width]
      line = line[width:]
      while line:
         yield '\n' + indent + line[:indent_width]
         line = line[indent_width:]

Utilisez comme ceci:

from StringIO import StringIO # Makes strings look like files

s = """abcdefg
abcdefghijklmnopqrstuvwxyz"""

for line in hard_wrap(StringIO(s), 12):
   print line,

Ce qui imprime:

abcdefg
abcdefghijkl 
 mnopqrstuvw 
 xyz

Autres conseils

On dirait que vous désactivez la plupart des fonctionnalités de TextWrapper, puis essayer d'ajouter un peu de votre propre. Je pense que vous seriez mieux d'écrire votre propre fonction ou classe. Si je vous comprends bien, vous cherchez simplement des lignes plus longues de 80 caractères, et les casser à la marque 80-char, et le reste par indenter un espace.

Par exemple, ceci:

s = """\
This line is fine.
This line is very long and should wrap, It'll end up on a few lines.
A short line.
"""

def hard_wrap(s, n, indent):
    wrapped = ""
    n_next = n - len(indent)
    for l in s.split('\n'):
        first, rest = l[:n], l[n:]
        wrapped += first + "\n"
        while rest:
            next, rest = rest[:n_next], rest[n_next:]
            wrapped += indent + next + "\n"
    return wrapped

print hard_wrap(s, 20, " ")

produit:

This line is fine.
This line is very lo
 ng and should wrap,
  It'll end up on a
 few lines.
A short line.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top