Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从web日志中拆分行_Python_List_Loops_Split - Fatal编程技术网

Python从web日志中拆分行

Python从web日志中拆分行,python,list,loops,split,Python,List,Loops,Split,我需要将行拆分为变量 以下是两行的示例: 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 但是,正如您所看到的,有时一条线缺少一块 我如何才能在没有错误的情况下拆分此文件 目前我正在使用: for x in log.readlines(

我需要将行拆分为变量

以下是两行的示例:

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
但是,正如您所看到的,有时一条线缺少一块

我如何才能在没有错误的情况下拆分此文件

目前我正在使用:

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个“项”


也许我应该使用多个分隔符来分割,但是我找不到一个好的方法…

为什么不这样做?假设您的日志字符串为:

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

这样,您就不必给出索引,并且可以删除硬编码。

为什么不这样做?假设您的日志字符串为:

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

这样,您就不必给出索引,并且可以删除硬编码。

您可以使用正则表达式来匹配日志的不同组件。然后,您需要检查请求部分是由命令、资源和版本组成,还是仅由命令和资源组成。类似这样的方法可能会奏效:

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]

您可以使用正则表达式来匹配日志的不同组件。然后,您需要检查请求部分是由命令、资源和版本组成,还是仅由命令和资源组成。类似这样的方法可能会奏效:

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]

因此,如果不是所有5个片段都存在,您希望代码做什么?还最后一块?如果是这样,那么
data[-1]
就可以了。data[-1]将返回
935
作为第一行,而
200
是数据[5]返回的主机名。所以我认为他并不总是想要最后一项。Maarten-你已经发布了两行,其中数据[5]返回你想要的。我认为对于任何回答这个问题的人来说,你还需要在数据[5]没有得到你想要的主机名的地方贴一行(例如,返回一个错误),然后解释确定主机名在你的字符串/列表中的位置的规则(因为它显然不总是空格分隔列表中的第5项)我想要每一条。我需要为这个日志文件创建一个解析器。所以我想分割这些行,这样我就可以创建用于排序等的函数。你仍然需要发布一行抛出错误的数据,然后解释应该如何处理它。现在我不认为有可能回答您的问题,因为没有人拥有您的数据,也没有人知道您希望如何处理少于7项的行。因此,如果不是所有5项都存在,您希望代码做什么?还最后一块?如果是这样,那么
data[-1]
就可以了。data[-1]将返回
935
作为第一行,而
200
是数据[5]返回的主机名。所以我认为他并不总是想要最后一项。Maarten-你已经发布了两行,其中数据[5]返回你想要的。我认为对于任何回答这个问题的人来说,你还需要在数据[5]没有得到你想要的主机名的地方贴一行(例如,返回一个错误),然后解释确定主机名在你的字符串/列表中的位置的规则(因为它显然不总是空格分隔列表中的第5项)我想要每一条。我需要为这个日志文件创建一个解析器。所以我想分割这些行,这样我就可以创建用于排序等的函数。你仍然需要发布一行抛出错误的数据,然后解释应该如何处理它。现在我认为不可能回答您的问题,因为没有人拥有您的数据,也没有人知道您希望如何处理少于7项的行。