好吧,尽管我对这个问题的评论没有得到任何回应,但这是我对一般性答案的看法。如果我有什么问题,请直接说出来,我会进行编辑以尝试解决错误。
首先,这是我的假设。您有两个文件,他们的名字存储在HostsLookFileLoc
和HostsURLFileLoc
变量中。
该文件HostsLookFileLoc
是一个 CSV 文件,每行的第三列有一个 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
是一个平面文本文件,每行一个 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 文件的行的第三列中找到的所有 IP 地址。在上面的示例列表中,localhost (127.0.0.1) 和 python.org (82.94.164.162) 将被排除,但列表中的其余 IP 将保留。
以下是我的做法,分三步:
- 读入 CSV 文件并使用
csv
模块对其进行解析以查找 IP 地址。将它们粘贴到set
.
- 打开平面文件并将 IP 地址读入 a
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 文件有一个混乱的行),但如果你做一些更复杂的事情可能会导致麻烦。