我是Python3的新手,并且使用文本文件。我正在尝试从以JavaScript(.js(扩展名结尾的日志文件中提取所有文件名。该文件还包含其他文件扩展名。我只想返回文件名而不是路径,按字母顺序对输出进行排序,并在日志条目中重复时显示uniuque值。
日志文件中的示例有:
72.133.47.242-【2013年4月25日:15:45:28-0700】"获取/包括/jquery.js HTTP/1.1"200 25139
22.133.47.242-【2013年4月25日:15:45:28-0700】"获取/包括/jquery.jshowoff.js HTTP/1.1"200 25139
在这种情况下,我只想返回jquery.js和 jquery.jshowoff.js这是我迄今为止的代码: 我的ouput只返回其中包含.js的行,但我不知道如何提取其余的行。我曾尝试使用regex进行匹配,但没有成功,因为我也是新手。如有任何帮助,我们将不胜感激。filepath = '/home/user/Documents/access_log.txt'
with open(filepath, 'r') as access_log:
contents = access_log.readlines()
for line in contents:
if ".js" in line:
print(line)
这可以用regex完成,但我想我只会给出一个python解决方案。
我采用的方法是根据操作系统路径字符/
拆分每一行。对于Windows操作系统,这将是"\"(因此,如果您希望这是跨平台的,请记住这一点(。这给出了一个列表。然后,我们在列表中的每个元素中搜索".js"。空间应该一直在那里。带有文件名的元素在文件名后面会有额外的东西,所以只需在".js"上拆分,只保留拆分的第一个元素。我也在代码中评论了这些片段。
with open(filepath, 'r') as access_log:
contents = access_log.readlines()
log_filenames = []
for line in contents:
# log_filenames on mac/linux will use / so split on that then search for filename
for fragment in line.split('/'):
if ".js " in fragment:
# there will be text after .js, so remove it
frags = fragment.split('.js ')
# split on ".js " will give us the base filename as first element of list
basename = frags[0]
filename = basename + '.js'
log_filenames.append(filename)
# get unique values
log_filenames = list(set(log_filenames))
# sort
log_filenames.sort()
print('n'.join(log_filenames))
输出:
jquery.js
jquery.jshowoff.js
注意:在获得唯一值时,我将set
转换回list
,以防您不习惯使用set
s。
这里是另一个纯Python解决方案,使用以下logfile.txt
作为我的输入:
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /include/jquery.js HTTP/1.1" 200 25139
22.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /include/jquery.jshowoff.js HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /2468.js HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /Abcd.js HTTP/1.1" 200 25139
22.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /abcd.js HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /aBcd.js HTTP/1.1" 200 25139
22.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET / asd.js HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /include/index.html HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /include/login.jsp HTTP/1.1" 200 25139
所有JavaScript文件名都存储在set
中,因为您只需要唯一的值。在打印之前,它们按字母顺序排列。
它在每一行上迭代,从字符串的末尾开始查找第一个.js
的索引,然后从查找.js
的位置开始,向左查找第一个/
的索引。
使用这两个索引对行进行切片,以提供文件名。如果找不到.js
,rfind
将返回-1
,这并不重要,因为在将文件名添加到set
之前,我们会在末尾检查文件名是否以.js
结尾。您可以使用rindex
,但对于没有.js
的行,您需要处理ValueError
。
filenames = set()
with open(r"C:UsersOld JoeDesktoplogfile.txt") as f:
for line in f:
end = line.rfind(".js") + 3 # 3 = len(".js")
start = line.rfind("/", 0, end) + 1 # 1 = len("/")
filename = line[start:end]
if filename.endswith(".js"):
filenames.add(filename)
for filename in sorted(filenames, key=str.lower):
print(filename)
输出:
asd.js
2468.js
aBcd.js
abcd.js
Abcd.js
jquery.js
jquery.jshowoff.js
login.js