テキストファイルの特定の行を別のテキストファイルにコピーしたいと思います。現在のスクリプトで文字列を検索すると、後ですべてがコピーされますが、テキストの特定の部分だけをコピーするにはどうすればよいですか?例えば。 「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()
ワンライナー:
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)
これを行うためのちょっとしたクリーンアップ方法です。これは、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)
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)
f=open('list1.txt')
f1=open('output.txt','a')
for x in f.readlines():
f1.write(x)
f.close()
f1.close()
これは100%動作しますこれを一度試してください
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()
安全でメモリ節約:
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
ブロックを使用すると、ファイルが終了時に確実に閉じられます。