我正在开发一个解析日志文件的程序,并返回IP地址和其他一些内容的热门命中。目前我遇到了麻烦,我无法将此问题的任何答案解释为我现在正在进行的操作。这是我的所有代码:
import gzip
from collections import Counter
logFileName = open('C:\\Users\\Pawlaczykm\\Desktop\\fileNames.txt', 'r')
ipAdd = []
landingPages = []
ALL_ipAdd = []
ALL_landingPages = []
# everything after this line gets done to all files
for line in logFileName.readlines():
# rstrip removes a blank line from output
# print 'Summary of: ' + line.rstrip()
# use gzip to decompress the file
with gzip.open('C:\\Users\\Pawlaczykm\\Desktop\\logFiles\\' + line.rstrip() + '.gz', 'rb') as f:
# we extract the ip addresses in lines 15-18
for eachLine in f:
parts = eachLine.split('\t')
if len(parts) > 1:
ipAdd.append(parts[2])
ALL_ipAdd.append(ipAdd)
# use gzip to decompress the file
with gzip.open('C:\\Users\\Pawlaczykm\\Desktop\\logFiles\\' + line.rstrip() + '.gz', 'rb') as f:
# we extract the landing pages
for eachLine in f:
parts = eachLine.split('\t')
if len(parts) > 1:
variable = parts[8].split('?')[0]
landingPages.append(variable)
v): (-v, k))[:10]
ALL_landingPages.append(landingPages)
ALL_ipAddDict = dict(Counter(ALL_ipAdd).most_common())
sortedALL_ipAdd = sorted(ALL_ipAddDict.iteritems(), key=lambda (k, v): (-v, k))[:10]
print 'Top IPs of all files'
print(sortedALL_ipAdd)
ALL_LandingPageDict = dict(Counter(ALL_landingPages).most_common())
sortedALL_LandingPage = sorted(ALL_LandingPageDict.iteritems(), key=lambda (k, v): (-v, k))[:10]
print 'Top landing pages of all files'
print (sortedALL_LandingPage)
现在我遇到麻烦的地方是以下几行:
ALL_ipAddDict = dict(Counter(ALL_ipAdd).most_common())
运行整个程序时的输出是:
Traceback (most recent call last):
File "C:/Users/Pawlaczykm/PycharmProjects/LogParse/parseText.py", line 35, in <module>
ALL_ipAddDict = dict(Counter(ALL_ipAdd).most_common())
File "C:\Python27\lib\collections.py", line 477, in __init__
self.update(*args, **kwds)
File "C:\Python27\lib\collections.py", line 567, in update
self[elem] = self_get(elem, 0) + 1
TypeError: unhashable type: 'list'
有人能帮助我吗?这令人沮丧。
答案 0 :(得分:3)
从您的代码ALL_ipAdd = []
和ipAdd = []
以及ALL_ipAdd.append(ipAdd)
,我们可以得出结论ALL_ipAdd
是一个列表清单。 Counter
是dict
的子类型,在计算它们之前对其进行哈希处理。列表不能被散列,因为它们是可变的(如果列表改变了散列会改变),因此列表不能被Counter
个对象计数。
要解决此问题,您可以在计算内部列表之前将其转换为元组:
ALL_ipAddDict = dict(Counter(map(tuple, ALL_ipAdd)).most_common())
答案 1 :(得分:-2)
这是正常的。 ALL_ipAdd
是列表清单。 Counter
需要列表,字符串或任何其他可哈希类型:)