2010-05-19 4 views
1

Я пытаюсь использовать textwrap для форматирования файла импорта, который весьма специфичен в том, как он отформатирован. В основном, это выглядит следующим образом (длина линии укорочен для простоты):Python Textwrap - форсирование «жестких» перерывов

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

Теперь у меня есть код, чтобы работать следующим образом:

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

Это работает почти идеально, однако, код оберточной текста не делает тяжелого разрыва на отметке 80 символов, он пытается быть умным и разбиваться на пробел (примерно 20 символов).

У меня есть это, заменив все пробелы в списке строк уникальным символом (#), обернув их, а затем удалив символ, но, безусловно, должен быть более чистый способ?

N.B Любые возможные ответы должны работать на Python 2.4 - извините!

ответ

1

версия генератора на основе может быть лучшим решением для вас, так как не нужно будет загрузить всю строку в память сразу:

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:] 

Используйте это так:

from StringIO import StringIO # Makes strings look like files 

s = """abcdefg 
abcdefghijklmnopqrstuvwxyz""" 

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

который печатает:

abcdefg 
abcdefghijkl 
mnopqrstuvw 
xyz 
1

Похоже, что вы отключите большую часть функций TextWrapper, а затем попытаетесь добавить немного своего. Я думаю, вам лучше написать свою собственную функцию или класс. Если я правильно понимаю вас, вы просто ищете строки длиной более 80 символов и разбиваете их на отметку 80 символов и откладываете остаток на одно место.

Например, это:

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

производит:

This line is fine. 
This line is very lo 
ng and should wrap, 
    It'll end up on a 
few lines. 
A short line.