4

いくつかのコード行とそれに続く文字列パターンを含むファイルがあります。ファイル 1 の文字列パターンを含む行の前にすべてを記述し、ファイル 2 の文字列パターンの後にすべてを記述する必要があります。

例 (ファイルの内容)

  • コードライン 1
  • コードライン 2
  • 文字列パターン
  • コードライン 3

出力は、コードライン 1、コードライン 2 のファイル 1、およびコードライン 3 のファイル 2 である必要があります。

ファイルの書き方には慣れているのですが、残念ながら文字列パターンの前後の内容を判断する方法がわかりません。

4

7 に答える 7

9

入力ファイルがメモリに収まる場合、最も簡単な解決策は次を使用することstr.partition()です。

with open("inputfile") as f:
    contents1, sentinel, contents2 = f.read().partition("Sentinel text\n")
with open("outputfile1", "w") as f:
    f.write(contents1)
with open("outputfile2", "w") as f:
    f.write(contents2)

これは、2 つの部分を区切る行の正確なテキストを知っていることを前提としています。

于 2012-06-13T18:20:47.740 に答える
5

このアプローチはLev'sに似ていますがitertools、楽しいので使用します。

 dont_break = lambda l: l.strip() != 'string_pattern'

 with open('input') as source:
     with open('out_1', 'w') as out1:
         out1.writelines(itertools.takewhile(dont_break, source))
     with open('out_2', 'w') as out2:
         out2.writelines(source)

必要に応じて、dont_break 関数を正規表現などに置き換えることができます。

于 2012-06-13T18:29:55.117 に答える
3
with open('data.txt') as inf, open('out1.txt','w') as of1, open('out2.txt','w') as of2:
    outf = of1
    for line in inf:
        if 'string pattern' in line:
            outf = of2
            continue  # prevent output of the line with "string pattern" 
        outf.write(line)

行ごとに機能するため、大きなファイルでも機能します。string pattern入力ファイルで 1 回だけ発生すると仮定します。ファイル全体がメモリに収まる場合str.partition()は、このアプローチが最も気に入っています (これは問題ではない可能性があります)。

を使用withすると、作業が完了したとき、または例外が発生したときにファイルが自動的に閉じられます。

于 2012-06-13T18:28:04.173 に答える
2

大きなファイルを処理し、限られた量のメモリを消費する、より効率的な答え。

inp = open('inputfile')
out = open('outfile1', 'w')
for line in inp:
  if line == "Sentinel text\n":
    out.close()
    out = open('outfile2', 'w')
  else:
    out.write(line)
out.close()
inp.close()
于 2012-06-13T18:24:45.087 に答える
2

単純な例 (Sven のようにファイルをメモリにロードしない):

with open('file', 'r') as r:
    with open('file1', 'w') as f:
        for line in r:
            if line == 'string pattern\n':
                break
            f.write(line)
    with open('file2', 'w') as f:
        for line in r:
            f.write(line)

'string pattern'これは、入力ファイルで 1 回発生することを前提としています。

パターンが固定文字列でない場合は、reモジュールを使用できます。

于 2012-06-13T18:23:32.867 に答える
2

3 行以下:

with open('infile') as fp, open('of1','w') as of1, open('of2','w') as of2:
    of1.writelines(iter(fp.readline, sentinel))
    of2.writelines(fp)
于 2012-06-13T22:09:09.840 に答える
1

次のようなものが必要です。

def test_pattern(x):
    if x.startswith('abc'): # replace this with some exact test
        return True
    return False

found = False
out = open('outfile1', 'w')
for line in open('inputfile'):
    if not found and test_pattern(line):
        found = True
        out.close()
        out = open('outfile2', 'w')
    out.write(line)
out.close()

行をstartswithに置き換えて、パターンで機能するテストを実行します(必要に応じて、reからのパターンマッチングを使用しますが、devider行を見つけたものはすべて実行します)。

于 2012-06-13T18:26:28.143 に答える