1

我正在尝试创建一个 WiFi 日志扫描仪。目前我们使用 CTRL+F 和我们的关键字手动浏览日志。我只想自动化这个过程。即敲入一个.txt 文件并接收输出。

我已经掌握了代码的基本内容,可以稍后再制作,但我遇到了一个小问题。我希望扫描仪搜索文件(完成),计算该字符串的实例(完成)并输出出现次数(完成),然后输出该字符串最后出现的整行,包括行号(行号不是必需的,只是让事情更容易做一个估计,如果有多个,这是最近的问题)。

目前,我正在获取包含字符串的每一行的输出。我知道为什么会这样,我只是想不出一种方法来指定只输出最后一行。

这是我的代码:

import os
from Tkinter import Tk
from tkFileDialog import askopenfilename

def file_len(filename):
    #Count Number of Lines in File and Output Result
    with open(filename) as f:
        for i, l in enumerate(f):
            pass     
    print('There are ' + str(i+1) + ' lines in ' + os.path.basename(filename))


def file_scan(filename):
    #All Issues to Scan will go here

    print ("DHCP was found " + str(filename.count('No lease, failing')) + " time(s).")
    for line in filename: 
        if 'No lease, failing' in line:
            print line.strip()

    DNS= (filename.count('Host name lookup failure:res_nquery failed') + filename.count('HTTP query failed'))/2
    print ("DNS Failure was found " + str(DNS) + " time(s).")
    for line in filename: 
        if 'Host name lookup failure:res_nquery failed' or 'HTTP query failed' in line:
            print line.strip()

    print ("PSK= was found " + str(testr.count('psk=')) + " time(s).")
    for line in ln:
        if 'psk=' in line:
            print 'The length(s) of the PSK used is ' + str(line.count('*'))



Tk().withdraw()
filename=askopenfilename()
abspath = os.path.abspath(filename) #So that doesn't matter if File in Python Dir
dname = os.path.dirname(abspath)    #So that doesn't matter if File in Python Dir
os.chdir(dname)                     #So that doesn't matter if File in Python Dir
print ('Report for ' + os.path.basename(filename))
file_len(filename)
file_scan(filename)

这几乎就是我的工作代码(只需要添加更多问题搜索),我有一个在这里搜索字符串而不是文本文件的版本。这将输出以下内容:

Total Number of Lines: 38
DHCP was found 2 time(s).
dhcp
dhcp
PSK= was found 2 time(s).
The length(s) of the PSK used is 14
The length(s) of the PSK used is 8

我那里只有一般的东西,修改为字符串而不是 txt 文件,但我正在扫描的字符串将是 txt 文件中的内容。

不要太担心 PSK,我想要列出所有示例,我会看看是否可以在稍后阶段将它们整理成一行。

作为旁注,其中很多都是以前的搜索混杂在一起的,所以我有一个好主意,可能有更简洁的方法可以做到这一点。这不是我目前关心的问题,但如果您对这方面有任何建议,请提供解释/链接来解释为什么您的方式更好。我对python相当陌生,所以我主要处理我目前理解的东西。:)

提前感谢您的帮助,如果您需要任何进一步的信息,请告诉我。

4

2 回答 2

7

为了搜索和计算字符串的出现次数,我通过以下方式解决了

'''---------------------Function--------------------'''
#Counting the "string" occurrence in a file
def count_string_occurrence():
    string = "test"
    f = open("result_file.txt")
    contents = f.read()
    f.close()
    print "Number of '" + string + "' in file", contents.count("foo")
        #we are searching "foo" string in file "result_file.txt"
于 2013-05-13T16:47:24.703 回答
1

我还不能对问题发表评论,但我想我可以用更多信息更具体地回答你只想要哪一行?

例如,您可以执行以下操作:

search_str = 'find me'
count = 0
for line in file:
    if search_str in line:
        last_line = line
        count += 1
print '{0} occurrences of this line:\n{1}'.format(count, last_line)

我注意到file_scan你在迭代两次file。您当然可以将其浓缩为一次迭代:)。

于 2013-02-07T19:07:41.617 回答