2017-05-01 6 views
0

変数を変数に分割する必要があります。あなたは行が1枚が欠けている、時々見ることができるように、しかしPythonはWebログから行を分割します

port11.annex1.naples.net [30:00:00:03] "GET /logos/small_gopher.gif HTTP/1.0" 200 935 
port11.annex1.naples.net [30:00:00:03] "GET /icons/book.gif" 200 935 

:ここ

は、2行の例です。

どうすればエラーが発生することなく分割できますか?現在

私が使用しています:

for x in log.readlines(): 
     data = x.split(" ") 
     hostname = data[0] 
     time = data[1] 
     command = data[2] 
     resource = data[3] 
     version = data[4] 
     status = data[5] 
     size = data[6] 

これは、エラーが発生します、いないすべての行が7「アイテム」

たぶん私は分割して、複数の区切り文字を使用する必要がありますを持っているので、しかし、私は良いを見つけることができませんその仕組み...

+0

5つのコードがすべて存在するわけではありませんが、コードで何をしたいですか?最後の作品を返しますか?もしそうなら、 'data [-1]'はそのトリックを行います。 – numbermaniac

+0

data [-1]は最初の行で '935'を返し、' 200'はdata [5]で返されたホスト名です。だから私は彼がいつも最後のアイテムを望んでいるとは思わない。 –

+0

Maarten - データ[5]があなたが望むものを返す2行を投稿しました。誰かがこの質問に答えるためには、data [5]があなたが望むホスト名を得られない(例えばエラーを返す)行を投稿し、ホスト名がどこにあるかを決定するルールが何であるかを説明する必要がありますあなたの文字列/リスト(それはapparetly常にスペース区切りリストの5番目の項目ではないので) –

答えて

0

どうしてこのようにしないのですか?

log = r'port11.annex1.naples.net [30:00:00:03] "GET /icons/book.gif" 200 935' 
data = log.split(" ") 
for i in data: 
    print i 

インデックスを与える必要はありませんし、ハードコーディングを削除することができますこの方法:あなたのログstringはこの1つであると仮定します。

0

正規表現を使用して、ログのさまざまなコンポーネントを照合することができます。次に、リクエスト部分がコマンド、リソース、バージョン、またはコマンドとリソースのみで構成されているかどうかを確認します。このようなものが動作する可能性があります:

import re 

# open your log file here... 

logmatcher = re.compile("([^ ]+) (\[[:0-9]+\]) (\"[^\"]+\") ([0-9]+) ([0-9]+)") 

for x in log.readlines(): 
    res = logmatcher.findall(x) 
    if len(res) > 0: 
    hostname = res[0][0] 
    time = res[0][1] 
    req = res[0][2][1:-1].split(" ") #[1:-1] to get rid of the "" 
    if len(req) > 2: # check if request contains the http version 
     command = req[0] 
     resource = req[1] 
     version = req[2] 
    else: 
     command = req[0] 
     resource = req[1] 
     version = "" # there's no version in the request. just use "" 
    status = res[0][3] 
    size = res[0][4] 
関連する問題