2010-05-19 7 views
1

J'essaie d'utiliser textwrap pour formater un fichier d'importation qui est assez particulier dans la façon dont il est formaté. En fait, il se présente comme suit (longueur de la ligne raccourci pour la simplicité):Python Textwrap - forcer des sauts «durs»

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

Maintenant, j'ai obtenu le code pour travailler 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 pause à la marque de 80 caractères, il essaie d'être intelligent et de casser un espace (à environ 20 caractères).

Je l'ai arrondi en remplaçant tous les espaces dans la liste de chaînes par un caractère unique (#), en les enveloppant et en supprimant le caractère, mais sûrement il doit y avoir une manière plus propre?

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

Répondre

1

Une version générateur pourrait être une meilleure solution pour vous, car il ne serait pas nécessaire de charger la chaîne entière 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:] 

utiliser comme ceci:

from StringIO import StringIO # Makes strings look like files 

s = """abcdefg 
abcdefghijklmnopqrstuvwxyz""" 

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

qui imprime:

abcdefg 
abcdefghijkl 
mnopqrstuvw 
xyz 
1

Il semble que vous désactiviez la plupart des fonctionnalités de TextWrapper, puis que vous essayiez d'en ajouter un peu. Je pense que vous feriez mieux d'écrire votre propre fonction ou classe. Si je vous comprends bien, vous cherchez simplement des lignes de plus de 80 caractères, et les cassez à la marque de 80 charmes, et indentez le reste d'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. 
Questions connexes