0

このテキストファイルから各AP行のクライアント数を取得する方法を理解しようとしています。これは、「クライアントの数」が関連付けられているクライアント(次の行)には問題ないようです。ただし、クライアントが関連付けられていないかどうかはわかりますが、多数のクライアントは出力されません。

次の行をチェックして「クライアントの数」が存在するかどうかを確認してから、現在の行に戻るロジックを理解できません。存在する場合は、次の行に進み、クライアント番号を取得する必要があります。'クライアントの数'行がない場合は、クライアントを0に設定しようとしています。

次のもので構成されるファイルがあります。

ワイヤレス-detail.txt

RUDY>show wireless ap detail on AP1 | include clients
RUDY>show wireless ap detail on AP2 | include clients
 Num of clients       : 8  
RUDY>show wireless ap detail on AP3 | include clients
 Num of clients       : 21
RUDY>show wireless ap detail on AP4 | include clients
RUDY>show wireless ap detail on AP5 | include clients
 Num of clients       : 2

今私は次のものを持っています:

for line in file:   
    if "AP" in line:
        ap = re.search('AP[0-99]+', line)
        print ap.group(0),
    elif "Num of clients" in line:  
        clients = re.search('[0-99]+', line)
        print '- ' + clients.group(0)

現在、次のように出力されます。

AP1 AP2 - 8
AP3 - 21
AP4 AP5 - 2
AP6 - 5
AP7 - 2
AP8 - 5
AP9 - 5

次の行をチェックして、APを0クライアントに設定する必要があるかどうかを確認するための最良の方法は何ですか?

編集:FWIW-file.next()で次の行を読み取ろうとしていましたが、これは機能しているようですが、前の行に戻ることができませんでした:/

編集#2:私はあなた方全員に賛成できたらいいのにと思います。みんなありがとう!それを行うには非常に多くの方法があり、そのうちの1つを理解できなかったのは信じられないほどです!!!!

4

5 に答える 5

2

正規表現を使用した短いメソッドを次に示します。re.MULTILINEフラグに注意してください

s='''RUDY>show wireless ap detail on AP1 | include clients
RUDY>show wireless ap detail on AP2 | include clients
 Num of clients       : 8  
RUDY>show wireless ap detail on AP3 | include clients
 Num of clients       : 21
RUDY>show wireless ap detail on AP4 | include clients
RUDY>show wireless ap detail on AP5 | include clients
 Num of clients       : 2'''
import re
print re.findall(r'(AP\d) \| include clients(?:$\n Num of clients {7}: (\d))?',s,flags=re.M)

(?:$\n Num of clients {7}: (\d))?非キャプチャグループを作成し、?最後に、それはオプションです。キャプチャしない場合、1と4の場合と同様に、2番目の一致するグループは空になります。

意味" {7}"7スペース

これを印刷します:

  [('AP1', ''), ('AP2', '8'), ('AP3', '2'), ('AP4', ''), ('AP5', '2')]
于 2012-04-03T22:29:16.570 に答える
1

辞書などのより構造化された形式でデータが必要な場合は、次のことを試してみてください。

with open('wireless-detail.txt', 'r') as fp:
    access_points = {}
    ap = None
    for line in fp:
        if 'AP' in line:
            ap = line[line.find('AP'):line.find('|')].strip()
            access_points[ap] = 0
        elif "Num of clients" in line:
            access_points[ap] = int(line.split(':')[1].strip())

print access_points

戻り値:

{'AP2': 8, 'AP3': 21, 'AP1': 0, 'AP4': 0, 'AP5': 2}

reあなたのファイルは確実に出力されるので、私はこの種のタスクにとって不必要な複雑さである以前の解決策に同意します。このアプローチの利点の1つは、接続されたユーザーがいない既知のアクセスポイントに関する情報も取得できることです。たとえば、AP1 = 0(int()形式でも!)

于 2012-04-03T22:39:52.493 に答える
0

難しく考えすぎだよ。正規表現は使用しないでください。彼らは遅く、バグがあり、あなたのパターンは非常に明確に定義されています。次のようなことをします...

for line in file:
    if "AP" in line:
        i = line.find('AP')
        splitLine = line[i+2:].split('|')
        val = splitLine[0]
        print val,
    elif "Num of clients" in line:
        splitLine = line.split(':')
        num = splitLine[1]
        print '- ' + num
于 2012-04-03T21:28:30.360 に答える
0

REを使用する場合は、次のようにすることができます。変数は、カウントラインが必要かどうかを判断するために使用されます。カウントラインが使用可能な場合はそれを使用し、使用できない場合はに設定され- 0ます。

need_count = 0
for line in file:   
    if "AP" in line:
        if need_count:
           print '- 0'
        ap = re.search('AP[0-99]+', line)
        print ap.group(0)
        need_count = 1
    elif "Num of clients" in line:  
        clients = re.search('[0-99]+', line)
        print '- ' + clients.group(0)
        need_count = 0
于 2012-04-03T21:31:16.007 に答える
0

これはおそらくやり過ぎですが、ここに行きます...

私はこのようないくつかの機能を備えたライブラリを作成しました。これらは頻繁に役立ちます。

def fileLineGroups (f, count=2, truncate=True):
    lines = []
    for line in f:
        lines.append(line)
        if len(lines) == count:
            yield lines
            lines = lines[1:]
    if not truncate:
        if lines:
            yield lines

これにより、開いているファイルハンドルの行が繰り返され、行のグループが生成されます。デフォルトは2のグループであるため、[line1、line2]、[line2、line3]などが返されます。切り捨てをオンのままにすると、カウント行が含まれていない場合、最終グループは返されません。 。これによりfor a, b in fileLineGroups(f)、最後のカウントが奇数の場合にエラーを発生させることなく、次のようなことができます。

今、あなたはこのようなことをすることができます:

import re
def getAPClientCounts (filepath):
    with open(filename) as f:
        for line1, line2 in py.fileLineGroups(f):
            match1 = re.search('AP\d*', line1)
            if match1:
                match2 = re.search('Num of clients.*: (\d*)', line2)
                if match2:
                    yield match1.group(), match2.groups()[0]

for ap, count in getAPClientCounts('wireless-detail.txt'):
    print 'AP with name %s has %s clients' % (ap, count)

AP with name AP2 has 8 clients
AP with name AP3 has 21 clients
AP with name AP5 has 2 clients
于 2012-04-03T22:42:22.413 に答える