2016-02-25 80 views
1

我需要寫打開兩個文件和功能,如果一定比較真實結果寫入第三個文件:蟒蛇通過迭代和寫入文件

def crack_pass_file(pass_filename,words_filename,out_filename): 
    f1=open(pass_filename) 
    f2=open(words_filename) 
    f3=open(out_filename,'w') 
    for line1 in f1: 
     x=make_dictionary(line1.split(":")) 
     password=x["password"] 
     name=x["account"] 
     for line2 in f2: 
      if (check_pass(line2.strip(),password)==True): 
       f3.write(name + "="+line2.strip()) 

文件F1是包含一個文件:

root:VgzdTLne0kfs6:0:0:Corema Latterll:/home/root:/bin/bash 
checani:IqAFDoIjL2cDs:1:1:Pengpu Checani:/home/checani:/bin/bash 
rkrakow:DLD3nJmCvt3pY:2:2:Rodentia Krakow:/home/rkrakow:/bin/bash 
forkland:oWMVyy1FTdNL6:3:3:Forkland Maskins:/home/forkland:/bin/bash 
obongo:O44lPEloqk5tY:4:4:Obongo Obwalden:/home/obongo:/bin/bash 
pglenda:xboW5dHcsqvSQ:5:5:Pahsien Glenda:/home/pglenda:/bin/bash 
madel:qEHvJXMkTSAZA:6:6:Madel Aporosa:/home/madel:/bin/bash 
ssauks:Q3Kz1z7eAiwjg:7:7:Schober Sauks:/home/ssauks:/bin/bash 
slajoie:wWTHgoE8SC8W6:8:8:Scheiner Lajoie:/home/slajoie:/bin/bash 
tieton:RWORYLxRSSzMU:9:9:Lerwa Tieton:/home/tieton:/bin/bash 

其中每行有一個用戶,一個密碼和一堆其他東西。對於第1行,root是用戶,VgzdTLne0kfs6是加密的密碼。每隔一行使用相同的格式。我需要做的是把加密後的口令,看看是否在其他文件中,F2密碼,其中包含按字母順序排列的話就像一個巨大的列表調用隱窩:

embordering 
emborders 
emboscata 
embosk 
embosked 
embosking 

將使該密碼進入加密的密碼。 我已經有了確實的功能和它的工作原理:

def check_pass(plain,enc): 
    s = enc[0:2] 
    x = crypt.crypt(plain, s) 
    if x==enc: return True 
    else: return False 

也在這裏是我用它來做一個字典出的文件1的每一行的makedictionary功能,也適用香港專業教育學院進行了測試:

def make_dictionary(s): 
    d={} 
    d["account"]=s[0] 
    d["shell"]=s[6] 
    d["UID"]=int(s[2]) 
    d["GID"]=int(s[3]) 
    d["GECOS"]=s[4] 
    d["directory"]=s[5] 
    d["password"]=s[1] 
    return d 

當我測試它時,它會寫入: root = stroam 到輸出文件,這是第一個用戶的解密密碼,但沒有寫任何其他文件。這應該是結果:

root=stroam 
checani=asarta 
rkrakow=sinklike 
obongo=yawnful 
madel=aviatic 
tieton=dagesh 
pglenda=sngissa 
forkland=relliarb 
slajoie=mu2j1k 
ssauks=EGaFeIHC 

我發現所有的這些話(yawnful,AVIATIC等)的字樣文件,但由於某種原因,他們沒有被匹配。我也試過這樣做: check_pass(「asarta」,「IqAFDoIjL2cDs」)和一些其他人,他們都返回true,所以我很困惑爲什麼他們更多沒有打印到我的輸出文件。

+0

對不起,但我沒有關注...你基本上想要2個文件逐行比較每個文件,並將匹配寫入第三個文件? – Seekheart

回答

0

想要針對f2中的每條線評估f1的每條線。但是您在第一次迭代時通過f1消耗f2中的每一行。在第二次迭代中,f2是空的,你不會進入這個循環的主體。

for line1 in f1: 
# ... 
    for line2 in f2: 

相反,你的for line in f1循環之外,產生F2(和可選F1)的行的列表,像這樣:

f2_lines = [line2 for line2 in f2] 
... 
for line1 in f1: 

現在你可以在使用

for line2 in f2_lines: 

你的f1循環的正文。

+0

爲什麼要用「列表」理解? 'f2_lines = list(f2)'可以更快,更簡單地完成相同的目標。 – ShadowRanger

+0

事實上,這還是更好。 –

+0

這只是一個字符串列表的文件?完美我需要那個。如果我這樣做會自動擺脫字符串末尾的換行符? –

0

您第一次迭代f2時,用盡了迭代器,並且所有將來的迭代f2都是根本不執行的循環。請將f2的所有行加載到list中,以便可以迭代多次,或者在耗盡復位文件指針後調用f2.seek(0)