Python Textwrap - 强制'硬'休息

时间:2010-05-19 12:04:32

标签: python python-2.x textwrapping python-2.4

我正在尝试使用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上运行 - 抱歉!

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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