2016-05-20 11 views
2

これは間違ってフォーマットすると謝罪します。指定された文字から長さが異なる行の指定された文字にスライス変数

だからXがlineという変数にその情報を格納し、0以上の任意の数とすることができる

Server[x] ip.ip.ip.ip response=235ms accepted....

を含む行のファイルを検索しています。

私は、このコンテンツをtkinter GUIに印刷しています。そのため、ウィンドウの情報が多すぎます。私が作ってみました私は機能でreturn line[15:30]と情報をダウンスライスだろうと思ったが、私はこれらの行をオフにしたい情報は常にこれを解決するには15と30

の間に入らないこの問題を解決するには

return line[cnt1:cnt2]

有するループcnt1が「S」を満たしているとcnt2は「」から受け付け満たすまでループでcnt1cnt2をチェック。

問題は、私がPythonを初めて使っていて、ループがうまく動作しないということです。

def serverlist(count): 
    try: 
     with open("file.txt", "r") as f: 
      searchlines = f.readlines() 
     if 'f' in locals(): 
      for i, line in enumerate(reversed(searchlines)): 
       cnt = 90 
       if "Server["+str(count)+"]" in line: 
        if line[cnt] == "t": 
         cnt += 1 
        return line[29:cnt] 
    except WindowsError as fileerror: 
     print(fileerror) 

ラインは、私は、テキストファイルで数分おきに何度も繰り返しを探していますので、私はラインの読みにreversedをしました。

元々、私は底からスキャンして、それがserver[0]になったときに停止したいと思っていましたが、このループは私のためには機能しませんでした。

私はあきらめて、ちょうどserverlist(count)を実行し、ちょうどserverlist()を実行するのではなく、私が探していたサーバー番号を指定し始めました。

元のループの問題を理解したらうまくいけばそれを解決できます。

file.txtをが、私はその行のうちだけServer[x]と応答時間を短縮し、それを表示したい

<timestamp/date> Server[x] ip.ip.ip.ip response=<time> accepted <unneeded garbage>

で複数の行があります。ここ

最終目標変数を使用しています。

行の範囲はServer[0]Server[999]で、数分ごとに同じ応答時間がチェックされるので、重複を避けてログの最後に最新のエントリを取得する必要があります。

残念ですが、これは長くて混乱します。


編集:ここでは

私は思考が動作するはず保つものですが、それはしません:

def serverlist(): 
ips = [] 
cnt = 0 
with open("file.txt", "r") as f: 
    for line in reversed(f.readlines()): 
     while cnt >= 0: 
      if "Server["+str(cnt)+"]" in line: 
       ips.append(line.split()) # split on spaces 
       cnt += 1 
return ips 

私のテストログファイルはサーバーを持っている[4]サーバを経由して、[0]。私は上記のファイル、プリントサーバー[4]行、サーバー[3]行などの下から読み取り、0に達すると停止すると思うだろうと考えています。これは、ファイル内のすべての行(より速く走る)、それは私に最新のデータだけを与えるでしょう。しかし、私がwhile cnt >=0でこれを実行すると、ループに詰まり、永遠に動きます。 1または2のような他の値で実行すると、空白リスト[]が返されます。私はこれがどのように機能するのか誤解していると思います。ここで

答えて

2

は私の最初のアプローチです:

def serverlist(count): 
    with open("file.txt", "r") as f: 
     for line in f.readlines(): 
      if "Server[" + str(count) + "]" in line: 
       return line.split()[1] # split on spaces 
    return False 

print serverlist(30) 
# ip.ip.ip.ip 

print serverlist(";-)") 
# False 

あなたがラインの特定のスペースで区切られた文字列を取得するにはline.split()[1]にインデックスを変更することができます。


編集:これは私が必要とするデータだけ下り回線を切断するための素晴らしいソリューションです

def serverlist(): 
    ips = [] 
    with open("file.txt", "r") as f: 
     for line in f.readlines(): 
      if line.strip().startswith("Server["): 
       ips.append(line.split()[1]) # split on spaces 
    return ips 
+0

:確かに、ちょうどすべてのIPのを取得するための条件場合を除きます。インデックスを3:6に変更して、必要なものを手に入れることができました。関数にループを追加して、1つのクエリですべての結果を得ることは可能ですか?これはサーバー[30]の結果を返します。 – sidnical

+0

これは、 "Server [x]"の行だけを取得しないので、ファイル内のすべての情報が多すぎます。 明確にするには:serverlist(0)、次にserverlist(1)、次にserverlist(2)などを実行して、必要な値を取得することができます。 。私はちょうどserverlist()を実行したいと思いますし、私のGUIに各サーバの情報を出力しますが、一回だけです。 – sidnical

+0

もう一度編集しました。ファイル内の数字は一意ですか? –

関連する問題