我编写了一个脚本来从日志文件中分割IP:
f = open("list.LOG" , "r" , encoding="utf8")
x = f.readlines()[6:99]
for i in x:
y = i.split(",")[4].split(":")[0]
print(y)
f.close()
out put:
168.62.187.180
168.62.187.180
168.62.187.180
168.62.187.180
113.23.50.88
113.23.50.88
113.23.50.88
113.23.50.88
137.135.120.84
137.135.120.84
137.135.120.84
137.135.120.84
我想删除重复的IP并写入文件" IP.txt"但是我没有想法。有人可以帮忙吗?谢谢
答案 0 :(得分:2)
有点解释:
你的第一个问题是,
我想删除重复的IP?
在这里,您可以在列表中使用set(),但是您的要求是保持唯一项目的顺序,因此set(x)
不是一个好主意。
你能做的是,
你的第二个问题是,
如何将它们写入文件?
这更简单,你知道如何打开/关闭你的文件,所以你必须知道的是你如何编写内容。使用f.write(content)
其中f
是文件对象。
试试这个:
f1 = open("list.LOG" , "r" , encoding="utf8")
x = f1.readlines()[6:99]
f1.close()
f2 = open("result.txt" , "a+" , encoding="utf8")
result = set()
for i in x:
y = i.split(",")[4].split(":")[0]
if y not in result:
result.add(y)
f.write(y + '\n')
f2.close()
我会像下面那样重构代码:
with open("list.LOG" , "r" , encoding="utf8") as f1,
open("result.txt" , "a+" , encoding="utf8") as f2:
result = set()
x = f.readlines()[6:99]
for i in x:
y = i.split(",")[4].split(":")[0]
if y not in result:
result.add(y)
f.write(y + '\n')
在打开文件时使用with
将关闭文件本身,因此您无需显式关闭它。
它有一个奇特的名字Context Manager
。
答案 1 :(得分:1)
result = list(set(y))
如果您想保留订单:
result = []
seen = set()
for i in y:
if i not in seen:
result.append(i)
seen.add(i)
然后将列表写入文件。
with open("IP.txt" , "a+" , encoding="utf8") as f:
f.write('\n'.join(result))