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