很抱歉,如果问题与以前的问题类似,但我找不到任何相关的答案来解决我的确切问题。
我在目录中有一组文本文件,我想要全部读取它们并解析它们。文件的格式是这样的(这意味着文件具有一个域的重复ip和一个ip的重复域以及重复的域| ip):
file 1: domain|ip
yahoo.com|9.9.9.9
mard.man.net|23.34.5.1
bbc.net|86.45.76.5
file 2:
google.com|9.9.9.9
yahoo.com|9.9.9.9
yahoo.com|23.34.5.1
我想要的是一个字典,它显示了独特的ips及其相关的独特域名数量,如下所示:
9.9.9.9,2
23.34.5.1,2
86.45.76.5,1
这是我为它写的脚本。
d = defaultdict(set)
for dirpath, dirs, files in os.walk(path):
for filename in fnmatch.filter(files, '*.*'):
with open(os.path.join(dirpath, filename)) as f:
for line in f:
if line.startswith('.'):
domain = line.split('|')[0]
ip = line.split('|')[1].strip('\n')
d[ip].add(domain)
但问题是,由于脚本在几个文本文件上运行,如果ip(key)已从一个文本文件一次写入字典(d),然后再次出现在另一个文本文件中,则字典会用新的值再写一次:
9.9.9.9,1
23.34.5.1,1
86.45.76.5,1
9.9.9.9,2
23.34.5.1,2
答案 0 :(得分:2)
我认为更好的方法是使用它将每个IP地址链接到域列表,而不是捕获遇到的最后一个域。
像:
if ip in d:
if domain not in d[ip]:
d[ip].append(domain)
else:
d[ip] = [domain]
现在您可以使用
获取计数len(d[ip])
任何给定的ip
答案 1 :(得分:1)
为什么不从集合中使用Counter类?它应该快得多。 所以你可以创建空的反对象:
c = Counter()
然后用新读取的文件中的数据更新它。 如果文件不是很大,我建议你使用" readlines"方法,然后使用列表推导一次处理所有行。