Python查找文件中最后出现的内容



我有一个不同IP的文件。

192.168.11.2
192.1268.11.3
192.168.11.3
192.168.11.3
192.168.11.2
192.168.11.5

这是我的代码,直到现在。我在哪里打印IP和出现,但是我如何才能找到每个IP的最后出现时间。这是一种简单的方法吗?

liste = []
dit = {}
file = open('ip.txt','r')
file = file.readlines()
for line in file:
        liste.append(line.strip())
for element in liste:
        if element in dit:
                dit[element] +=1
        else:
                dit[element] = 1
for key,value in dit.items():
        print "%s occurs %s times, last occurence at line"  %(key,value)
输出:

192.1268.11.3 occurs 1 times, last occurence at line
192.168.11.3 occurs 2 times, last occurence at line
192.168.11.2 occurs 2 times, last occurence at line
192.168.11.5 occurs 1 times, last occurence at line

试试这个:

liste = []
dit = {}
file = open('ip.txt','r')
file = file.readlines()
for line in file:
        liste.append(line.strip())
for i, element in enumerate(liste, 1):
        if element in dit:
                dit[element][0] += 1
                dit[element][1] =  i
        else:
                dit[element] = [1,i]
for key,value in dit.items():
        print "%s occurs %d times, last occurence at line %d" % (key, value[0], value[1])

解决方案:

from collections import Counter
with open('ip.txt') as input_file:
    lines = input_file.read().splitlines()
    # Find last occurrence, count
    last_line = dict((ip, line_number) for line_number, ip in enumerate(lines, 1))
    ip_count = Counter(lines)
    # Print the stat, sorted by last occurrence
    for ip in sorted(last_line, key=lambda k: last_line[k]):
        print '{} occurs {} times, last occurence at line {}'.format(
            ip, ip_count[ip], last_line[ip])            
<标题> 讨论
  • 我使用enumerate函数生成行号(从第1行开始)
  • 使用(ip, line_number)序列,很容易生成字典last_line,其中键是ip地址,值是它出现的最后一行
  • 为了计算发生的次数,我使用Counter类——非常简单的
  • 如果您希望按IP地址排序的报告,使用sorted(last_line)
  • 这个解决方案对性能有影响:它扫描ip列表两次:一次计算last_line,一次计算ip_count。这意味着如果文件很大,这个解决方案可能不是理想的
last_line_occurrence = {}
for element, line_number in zip(liste, range(1, len(liste)+1)):
     if element in dit:
            dit[element] +=1
     else:
            dit[element] = 1
     last_line_occurrence[element] = line_number
for key,value in dit.items():
     print "%s occurs %s times, last occurence at line %s"  %(key,value, last_line_occurrence[key])

这可以很容易地一次完成,而不需要将所有文件读入内存:

from collections import defaultdict
d = defaultdict(lambda: {"ind":0,"count":0})
with open("in.txt") as f:
    for ind, line in enumerate(f,1):
        ip = line.rstrip()
        d[ip]["ind"] = ind
        d[ip]["count"]  += 1
for ip ,v in d.items():
    print("IP {}  appears {} time(s) and the last occurrence is at  line {}".format(ip,v["count"],v["ind"]))
输出:

IP 192.1268.11.3  appears 1 time(s) and the last occurrence is at line 2
IP 192.168.11.3  appears 2 time(s) and the last occurrence is at line 4
IP 192.168.11.2  appears 2 time(s) and the last occurrence is at line 5
IP 192.168.11.5  appears 1 time(s) and the last occurrence is at line 6

如果您想要ip的第一次遇到的顺序,使用OrderedDict:

from collections import OrderedDict
od = OrderedDict()
with open("in.txt") as f:
    for ind, line in enumerate(f,1):
        ip = line.rstrip()
        od.setdefault(ip, {"ind": 0,"count":0})
        od[ip]["ind"] = ind
        od[ip]["count"] += 1
for ip ,v in od.items():
    print("IP {}  appears {} time(s) and the last occurrence is at  line {}".format(ip,v["count"],v["ind"]))
输出:

IP 192.168.11.2  appears 2 time(s) and the last occurrence is at line 5
IP 192.1268.11.3  appears 1 time(s) and the last occurrence is at line 2
IP 192.168.11.3  appears 2 time(s) and the last occurrence is at line 4
IP 192.168.11.5  appears 1 time(s) and the last occurrence is at line 6

您可以使用另一本字典。在这个字典中,您为每行存储最后一次出现的行号,并在每次发现另一个出现时重写。最后,在这个字典中,您将得到每行最后出现的行号。

显然,您需要为每个已读行增加一个计数器,以便知道您现在正在读取的行

相关内容

  • 没有找到相关文章

最新更新