40

特定のテキスト行をあるテキスト ファイルから別のテキスト ファイルにコピーしたいと考えています。現在のスクリプトでは、文字列を検索すると、後ですべてがコピーされますが、テキストの特定の部分だけをコピーするにはどうすればよいですか? たとえば、「tests/file/myword」が含まれている場合にのみ行をコピーしますか?

現在のコード:

#!/usr/bin/env python
f = open('list1.txt')
f1 = open('output.txt', 'a')

doIHaveToCopyTheLine=False

for line in f.readlines():

    if 'tests/file/myword' in line:
        doIHaveToCopyTheLine=True

    if doIHaveToCopyTheLine:
        f1.write(line)

f1.close()
f.close()
4

7 に答える 7

84

ワンライナー:

open("out1.txt", "w").writelines([l for l in open("in.txt").readlines() if "tests/file/myword" in l])

推奨with:

with open("in.txt") as f:
    lines = f.readlines()
    lines = [l for l in lines if "ROW" in l]
    with open("out.txt", "w") as f1:
        f1.writelines(lines)

メモリの使用量が少ない:

with open("in.txt") as f:
    with open("out.txt", "w") as f1:
        for line in f:
            if "ROW" in line:
                f1.write(line) 
于 2013-03-11T16:40:20.983 に答える
9

これを行うためのわずかにクリーンアップされた方法です。これは ATOzTOA の回答よりも多かれ少なかれパフォーマンスが高いわけではありませんが、with ステートメントを 2 つ別々に実行する理由はありません。

with open(path_1, 'a') as file_1, open(path_2, 'r') as file_2:
    for line in file_2:
        if 'tests/file/myword' in line:
            file_1.write(line)
于 2015-10-06T18:50:51.410 に答える
9

readlines() は入力ファイル全体をリストに読み込みますが、パフォーマンスは良くありません。ファイル内の行を繰り返すだけです。完了時に自動的に閉じられるように、output.txt で「with」を使用しました。forループが終了すると閉じられるため、「list1.txt」では必要ありません。

#!/usr/bin/env python
with open('output.txt', 'a') as f1:
    for line in open('list1.txt'):
        if 'tests/file/myword' in line:
            f1.write(line)
于 2013-03-11T17:10:52.510 に答える
-2
f = open('list1.txt')
f1 = open('output.txt', 'a')

# doIHaveToCopyTheLine=False

for line in f.readlines():
    if 'tests/file/myword' in line:
        f1.write(line)

f1.close()
f.close()

これで、コードが機能します。これを試してみてください。

于 2015-10-24T19:44:39.363 に答える