2

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 文字) でブレークしようとします。

文字列リスト内のすべてのスペースを一意の文字 (#) に置き換え、それらをラップしてから文字を削除することでこれを回避しましたが、確かにクリーンな方法があるはずですか?

NB Python 2.4で動作する必要がある回答はすべて可能です-申し訳ありません!

4

2 に答える 2

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
于 2010-07-11T00:11:32.420 に答える
1

TextWrapper のほとんどの機能を無効にしてから、独自の機能を少し追加しようとしているようです。独自の関数またはクラスを作成する方がよいと思います。私の理解が正しければ、単に 80 文字を超える行を探し、80 文字のところで区切り、残りを 1 スペース分インデントしているだけです。

たとえば、次のようになります。

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.
于 2010-05-19T12:11:29.997 に答える