0

大きなテキストファイルがありますが、コンソールの幅が原因で列80に改行があります。テキストファイルの行の多くは80文字の長さではなく、改行の影響を受けません。擬似コードでは、これが私が欲しいものです:

  • ファイル内の行を反復処理します
  • 行がこの正規表現パターンに一致する場合:^(。{80})\ n(。+)
    • この行を、match.group(1)とmatch.group(2)で構成される新しい文字列に置き換えます。この行から改行を削除するだけです。
  • 行が正規表現と一致しない場合は、スキップしてください。

たぶん私はこれを行うために正規表現を必要としませんか?

4

4 に答える 4

1

このことを考慮。

def merge_lines( line_iter ):
    buffer = ''
    for line in line_iter:
        if len(line) <= 80:
            yield buffer + line
            buffer= ''
        else:
            buffer += line[:-1] # remove '\n'

with open('myFile','r') as source:
    with open('copy of myFile','w') as destination:
        for line in merge_lines( source ):
            destination.write(line)

明示的なジェネレーター関数を使用すると、モックファイルシステムを作成したり、テストのために多くの凝ったセットアップや分解を行ったりすることなく、スクリプトの基本的なロジックのテストとデバッグがはるかに簡単になります。

于 2010-03-18T10:16:40.547 に答える
1
f=open("file")
for line in f:
    if len(line)==81:
       n=f.next()
       line=line.rstrip()+n
    print line.rstrip()
f.close()
于 2010-03-18T09:26:33.140 に答える
1

これはトリックにすべきいくつかのコードです

def remove_linebreaks(textfile, position=81):
    """
    textfile : an file opened in 'r' mode
    position : the index on a line at which \n must be removed

    return a string with the \n at position removed
    """
    fixed_lines = []
    for line in textfile:
        if len(line) == position:
            line = line[:position]
        fixed_lines.append(line)
    return ''.join(fixed_lines)

疑似コードと比較して、これは連続する折り畳まれた行の任意の数をマージすることに注意してください。

于 2010-03-18T09:15:54.457 に答える
0

これをアーカイブするために正規表現を使用する方法の例を次に示します。しかし、正規表現はどこでも最善の解決策ではありません。この場合、正規表現を使用しない方が効率的だと思います。とにかく、ここに解決策があります:

text = re.sub(r'(?<=^.{80})\n', '', text)

re.sub呼び出し可能オブジェクトを使用して呼び出すときに、正規表現を使用することもできます。

text = re.sub(r'^(.{80})\n(.+)', lambda m: m.group(1)+m.group(2), text)
于 2010-03-18T09:23:20.613 に答える