300,000行以上のtxtファイルAと600,000行以上のtxtファイルBを取得しました。今私がやりたいことは、ファイルAを1行ずつふるいにかけることです。その行がファイルBに表示されない場合は、ファイルCに追加されます.
問題は、上で述べたようにプログラムすると、すべての作業を完了するのに文字通り何年もかかることです。これを行うためのより良い方法はありますか?
これはかなり速いはずです:
with open("a.txt") as a:
with open("b.txt") as b:
with open("c.txt", "w") as c:
c.write("".join(set(a) - set(b)))
これは、A または B にあった順序を無視することに注意してください。A からの順序を絶対に保持する必要がある場合は、次のように使用できます。
with open("a.txt") as a:
with open("b.txt") as b:
with open("c.txt", "w") as c:
b_lines = set(b)
c.write("".join(line for line in a if not line in b_lines))
Bを記憶に留めることができますか?その場合は、ファイル B を読み取り、そこに含まれるすべての行でインデックスを作成します。次に、A を 1 行ずつ読み、インデックスに表示されるかどうかを各行で確認します。
with open("B") as f:
B = set(f.readlines())
with open("A") as f:
for line in f.readlines():
if line not in B:
print(line)
Pythonについては何も知りませんが、ファイルAを特定の順序でソートするのはどうですか? 次に、ファイル B を 1 行ずつ調べて、バイナリ検索を実行できます。より効率的です。
ファイル B のすべての行を a に読み込みますset
。
blines = set(file_b)
for line in file_a:
if not line in blines:
append_to_file_c
600k+ は実際にはそれほど多くのデータではありません...