わかりました、質問に対する私のコメントへの回答はありませんが、ここで一般的な回答を示します。何か問題がある場合は、そう言ってください。エラーに対処するために編集します。
まず、ここに私の仮定があります。2 つのファイルがあり、その名前がHostsLookFileLoc
およびHostsURLFileLoc
変数に格納されています。
のファイルHostsLookFileLoc
は CSV ファイルで、各行の 3 列目に IP アドレスがあります。このようなもの:
HostsLookFile.csv:
blah,blah,192.168.1.1,whatever,stuff
spam,spam,82.94.164.162,eggs,spam
me,myself,127.0.0.1,and,I
...
のファイルHostsURLFileLoc
は、次のように 1 行に 1 つの IP アドレスを持つフラット テキスト ファイルです。
HostsURLFile.txt:
10.1.1.2
10.1.1.3
10.1.2.253
127.0.0.1
8.8.8.8
192.168.1.22
82.94.164.162
64.34.119.12
...
目標はHostsURLFile.txt
、CSV ファイルの行の 3 列目にあるすべての IP アドレスを除外して、ファイルを読み取ってから書き直すことです。上記のリストの例では、localhost (127.0.0.1) と python.org (82.94.164.162) は除外されますが、リスト内の残りの IP は残ります。
3つのステップでそれを行う方法は次のとおりです。
- CSV ファイルを読み取り、モジュールを使用して解析し
csv
、IP アドレスを見つけます。それらをに貼り付けますset
。
- フラット ファイルを開き、IP アドレスを に読み込み、
list
後でファイルを閉じます。
- フラット ファイルを再度開いて、ロードされたアドレスのリストで上書きし、最初の手順のセットに含まれているものはすべてスキップします。
コード:
import csv
def cleanURLFile(HostsLookFileLoc, HostsURLFileLoc):
"""
Remove IP addresses from file at HostsURLFileLoc if they are in
the third column of the file at HostsLookFileLoc.
"""
with open(HostsLookFileLoc, "r") as hostsLookFile:
reader = csv.reader(hostsLookFile)
ipsToExclude = set(line[2].strip() for line in reader)
with open(HostsURLFileLoc, "r") as hostsURLFile:
ipList = [line.strip() for line in hostsURLFile]
with open(HostsURLFileLoc, "w") as hostsURLFile: # truncates the file!
hostsURLFile.write("\n".join(ip for ip in ipList
if ip not in ipsToExclude))
このコードは意図的に単純化されています。ユースケースにとって重要な場合は、改善できることがいくつかあります。
- 書き換えステップ中に何かがプログラムをクラッシュさせた場合、HostsURLFile.txt が破壊される可能性があります。(少なくとも、Unix スタイルのシステムでは) 書き換えるより安全な方法は、一時ファイルに書き込み、書き込みが完了した (そしてファイルが閉じられた) 後、古いファイルの上に一時ファイルの名前を変更することです。そうすれば、プログラムがクラッシュした場合でも、元のバージョンまたは完全に作成された代替バージョンを引き続き使用できますが、その間には何もありません.
- 必要なチェックがセット メンバーシップよりも複雑な場合は、実際の処理を行うために 2 と 3 の間に追加の手順を追加し、それ以上の操作を行わずに (改行を追加する以外は) 結果を書き出します。
- 改行といえば、末尾に改行がある場合、IP アドレスのリストに空の文字列として渡されますが、このシナリオでは問題ありません (除外する IP のセットには含まれません。 CSV ファイルの行がめちゃくちゃになっています) が、より複雑なことを行うと問題が発生する可能性があります。