2016-06-14 41 views
-2

我有4个表:Python的检查三个列表追加到第四

“criticallist”`

[ade4c7059e17ab9e47d2aaec6cf04a9d, 882edee4cc71806190ca43993e8b2eb5, nekspzwjxhqroiu.com, htfbzqewll.org]` 

“大师”

[4d7d1c89529bcfcbbbbf9d6a2ba42cb5, 9f26da4de1653f609e7b4bcaade63daa] 

,然后将每个函数MD5的独立名单 - [出。 49f12a7b358c7f7cba005610210418aa] “md5-ThreatExpert”和“md5-HybridAnalysis”,它们都在它们各自的函数中,我将其重命名为“md5threat”。

然后在每个函数中,我试图比较“关键列表”和“主”对“md5threat”。

任何不属于“关键列表”或“主”的“md5threat”都会添加到“md5broinput”中。
AND 如果它被添加到“md5broinput”,它也会附加回“主”。

“md5broinput”每一天都是新的,我会每周擦拭“主人”。

def md5threatexpertcritical(): 
    filename = open("md5-ThreatExpert-bro", 'w') #input file for bro script gone through critical checks 
    md5threat = "md5-ThreatExpert" #latest md5's from MISP 

    #create bromaster if doesn't exist 
    if os.path.exists("bromasterlist"): 
     pass 
    else: 
     f = file("bromasterlist", "w") 
     f.close() 

    master  = "bromasterlist" #master bro list that we've already added to bro 
    PATH   = "/opt/critical-stack/frameworks/intel" 
    CRITICAL  = "master-public.bro.dat" 
    CRITICALSTACK = os.path.join(PATH, CRITICAL) 
    criticallist = "/home/money/Documents/hybrid/critical" 
    whitelist  = open(criticallist,'w') 
    with open(CRITICALSTACK,'r') as CRITICALSTACK1: 
     reader = csv.reader(CRITICALSTACK1, delimiter='\t') 
     CRITICAL = [] 
     for row in reader: 
      CRITICAL.append(row[0]) 
    whitelist.write("\n".join(CRITICAL)) 


    x=[] 
    y=[] 
    z=[] 
    md5broinput=[] 
    with open(criticallist, 'r') as critical: 
     for line in critical: 
      line = line.strip() 
      x.append(line) 
     with open(master, 'r') as bromaster: 
      for line in bromaster: 
       line = line.strip() 
       y.append(line) 
      with open(md5threat, 'r') as md5threat: 
       for line in md5threat: 
        line = line.strip() 
        z.append(line) 
       for md5 in z: 
        if md5 in y: 
         print md5+" is in bromaster" 
         pass 
        elif md5 in x: 
         print md5+" is in critical" 
         pass 
        elif md5 not in x and y:       
         y.append(md5) 
         md5broinput.append(md5) 
    filename.write("\n".join(md5broinput)) 
    filename.close() 
    f=open(master,'a') 
    f.write("\n".join(set(y))) 
    f.write("\n") 
    f.close() 

def md5hybridanalysiscritical(): 
    filename  = open("md5-HybridAnalysis-bro", 'w+') 
    md5threat  = "md5-HybridAnalysis" #latest md5's from MISP 

    master  = "bromasterlist" #master bro list that we've already added to bro 
    PATH   = "/opt/critical-stack/frameworks/intel" 
    CRITICAL  = "master-public.bro.dat" 
    CRITICALSTACK = os.path.join(PATH, CRITICAL) 
    criticallist = "/home/money/Documents/hybrid/critical" 

    x=[] 
    y=[] 
    z=[] 
    md5broinput=[] 
    with open(criticallist, 'r') as critical: 
     for line in critical: 
      line = line.strip() 
      x.append(line) 
     with open(master, 'r') as bromaster: 
      for line in bromaster: 
       line = line.strip() 
       y.append(line) 
      with open(md5threat, 'r') as md5threat: 
       for line in md5threat: 
        line = line.strip() 
        z.append(line) 
       for md5 in z: 
        if md5 in y: 
         print md5+" is in bromaster" 
         pass 
        elif md5 in x: 
         print md5+" is in critical" 
         pass 
        elif md5 not in x and y:       
         y.append(md5) 
         md5broinput.append(md5) 
    filename.write("\n".join(md5broinput)) 
    filename.close() 
    f=open(master,'a') 
    f.write("\n".join(set(y))) 
    f.write("\n") 
    f.close() 
+0

问题的第一句话你有四个名为“criticallist,master,md5threat,md5broinput”的列表,**其中只有一个是你的代码中的列表**其他列表是由变量'x, y,z'这使得在阅读了关于'master'列表和其他的描述之后更加难以理解。 –

回答

3

试试这个作为你的代码的重构。当list comprehension更为pythonic时,代码使用"with"作为上下文。新增@nbryans回答..

https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

filename = open("md5-HybridAnalysis-bro", 'wb+') 
md5threat = open("md5-HybridAnalysis" , 'rb') # 

x = [line.strip() for line in criticallist ] 
y = [line.strip() for line in master] 
z = [line.strip() for line in md5threat] 
md5broinput = [] 

#print x[:6] 
#print y[:6] 
#print z[:6] 

for md5 in z: 
    if md5 in y: 
     print md5+" is in bromaster" 
    elif md5 in x: 
     print md5+" is in critical" 
    else:      
     y.append(md5) 
     md5broinput.append(md5) 


filename.write("\n".join(md5broinput)) 
filename.close() 
f=open(master,'a') 
f.write("\n".join(y)) 
f.write("\n") 
f.close() 
+0

@Merline喜欢这一个,因为我知道我需要移动到内涵更多,但它给了我 - m是bromaster d处于临界 h是在关键的 r在bromaster e是在bromaster 一个在bromaster t为bromaster e是在bromaster r为bromaster s在bromaster所有列表那种看起来就像这样 - 862a5c99d01a9ba9bd7b92b33d76ec39 aa101c5e81817f8d8cc95490c00b3591 – Dpitt1968

+0

嘿@Merlin - 不幸的是,他们都看起来完全一样882edee4cc71806190ca43993e8b2eb5或nekspzwjxhqroiu.com。无论是MD5或网址。 – Dpitt1968

+0

啊,它是一个包含md5列表的文件,我不直接调用。我不认为这有所作为,但似乎并没有,但我不确定。 – Dpitt1968

1

如果我理解正确的问题,你想

for md5 in z: 
    if md5 in y: 
     print md5+" is in bromaster" 
     pass 

,因为它是现在写的,你说这“是bromaster”之后,你检查if md5 not in y,其中y是高手。

0

我会建议清理代码,以避免在想要与对方进行比较的许多级别的信息中丢失。一种方法是没有名字比如从内容到criticallist X(如时列表中检索)等一下...

这个怎么样:

#! /usr/bin/env python 
from __future__ import print_function 

md5threat = "md5-HybridAnalysis" 
criticallist = "some_criticallist.txt" 
master = "some_master.txt" 
x_crit, y_mast, z_md5t = [], [], [] 
md5broinput = [] 
with open(criticallist, 'r') as critical: 
    for line in critical: 
     x_crit.append(line.strip()) 
    with open(master, 'r') as bromaster: 
     for line in bromaster: 
      y_mast.append(line.strip()) 
     with open(md5threat, 'r') as md5threat: 
      for line in md5threat: 
       z_md5t.append(line.strip()) 
      for a_md5 in z_md5t: 
       if a_md5 in y_mast: 
        print(a_md5 + " is in bromaster") 
        pass 
       elif a_md5 in x_crit: 
        print(a_md5 + " is in critical") 
        pass 
       else: 
        y_mast.append(a_md5) 
        md5broinput.append(a_md5) 

with open("md5-HybridAnalysis-bro", 'w+') as o_f: 
    o_f.write("\n".join(md5broinput)) 

with open(master, 'a') as m_f: 
    m_f.write("\n".join(y_mast) + '\n') 

然后作为@nbryans已经发现变化:

  for a_md5 in z_md5t: 
       if a_md5 not in y_mast: 
        print(a_md5 + " is in bromaster") 
        pass 

到:

  for a_md5 in z_md5t: 
       if a_md5 in y_mast: 
        print(a_md5 + " is in bromaster") 
        pass 

我宁愿@merlins答案。如果您想进一步使用上下文管理器并同时构建完整列表,那么为什么不首先从文件加载,将块依次放置,而是执行分析匹配循环 - 要有串行收集阶段和集中组合algortihm只有名单。

+1

看看我的重构。 – Merlin

+0

谢谢@Merlin我第一次没有得到它,但最好给一个正确的代码,而不是我的显示重构错误的代码,然后更换配方。我经常要求自己从不容易复制和粘贴代码的人那里得到答案,然后我自己做。再次感谢;-) – Dilettant

0

所以这段代码说当md5不在y中时,所以如果没有附加的其他东西,它会触发这个。

当前代码:

 for md5 in z: 
      if md5 not in y: 
       print md5+" is in bromaster" 
       pass 
      elif md5 in x: 
       print md5+" is in critical" 
       pass 
      else:      
       y.append(md5) 
       md5broinput.append(md5) 

我认为代码应该说:

 for md5 in z: 
      if md5 in y:     #<--- This is the line changed 
       print md5+" is in bromaster" 
       pass 
      elif md5 in x: 
       print md5+" is in critical" 
       pass 
      else:      
       y.append(md5) 
       md5broinput.append(md5) 
0

感谢@Merlin您的帮助其大加赞赏,我与理解返工吧。我给你指出了哪些地方可以做到!

如果你看一下,我做了我的错误,我在检查名单y,然后在循环中追加到它在最后所以它像一个永无止境的循环 -

我取代 -

  for md5 in z: 
       if md5 in y: 
        print md5+" is in bromaster" 
        pass 
       elif md5 in x: 
        print md5+" is in critical" 
        pass 
       elif md5 not in x and y:       
        y.append(md5) #I got rid of this line and it works great. 
        md5broinput.append(md5) 

与 -

  for md5 in z: 
       if md5 in y: 
        print md5+" is in bromaster" 
        pass 
       elif md5 in x: 
        print md5+" is in critical" 
        pass 
       elif md5 not in x and y:       
        md5broinput.append(md5) 

我很感激你们我在某些时候,我就在这里帮助新人真希望!