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项的行。