web-dev-qa-db-ja.com

Pythonを使用して、あるテキストファイルから別のテキストファイルにコピーする

テキストファイルの特定の行を別のテキストファイルにコピーしたいと思います。現在のスクリプトで文字列を検索すると、後ですべてがコピーされますが、テキストの特定の部分だけをコピーするにはどうすればよいですか?例えば。 「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()
24
DevCon

ワンライナー:

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) 
63
ATOzTOA

これを行うためのちょっとしたクリーンアップ方法です。これは、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)
7
sage88

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)
6
tdelaney
f=open('list1.txt')  
f1=open('output.txt','a')
for x in f.readlines():
    f1.write(x)
f.close()
f1.close()

これは100%動作しますこれを一度試してください

1
Pavan Biradar

open( "list1.txt")with f:doIHaveToCopyTheLine = False '' '出力ファイルを書き込みモードで開く' '' with open( "output.txt"、 'w')as f1: '' '行ごとに繰り返すf ''の行の場合: 'tests/file/myword'が行の場合:doIHaveToCopyTheLine = True Elif doIHaveToCopyTheLine:f1.write(line)

f1.close()f.close()

0

安全でメモリ節約:

with open("out1.txt", "w") as fw, open("in.txt","r") as fr: 
    fw.writelines(l for l in fr if "tests/file/myword" in l)

一時的なリストは作成されません(readlineおよび[]は、ファイルが巨大な場合は非スターターです)、すべてがジェネレーター内包表記で行われ、withブロックを使用すると、ファイルが終了時に確実に閉じられます。