2013-07-06 46 views
0

我有用Python編寫的代碼。它基於變量'i'生成兩個文件。現在,我需要將這兩個生成的文件中的一個與密鑰文件進行比較,以獲取「i」的正確值。在Python中遞歸比較文件

我正在使用FOR循環來測試'i'值的範圍並使用filecmp.cmp將生成的文件之一與密鑰文件進行比較。當我找到匹配的時候,這意味着我擁有'我'的正確值。

下面是代碼的一部分:

for i in range(100,0,-1): 

.... 

    with open("file1", "w") as p, open("file2", "w") as q: 
     # generate data based on the value of i and write it to the files 

    if(filecmp.cmp("file1", "keyfile")) 
      print "%d is the correct value of it" % i 
      break 

應該以這種方式工作:

  1. 測試的值 'i' 的從100到0遞減 'i' 的一個接一個。
  2. file1和file2是使用基於'i'值的代碼生成的。
  3. 現在,我正在比較file1和密鑰文件。如果他們有相同的內容,我找到了正確的鍵,我打破了FOR循環。

我已經把filecmp.cmp語句放在if語句中,因爲它返回一個布爾值如果兩個文件相等,則爲True。當我運行代碼時,這行會引發錯誤。

另外,這是做到這一點的正確方法?每次執行FOR循環時,它都會生成兩個文件file1和file2。 With語句將在循環之後關閉這兩個文件。但是在循環的下一次運行中,這兩個文件是否會被新內容覆蓋?

謝謝。

+1

你真的有產生這兩個文件?難道你不能把內容保存在兩個變量中並比較它們,而不是寫入磁盤,然後重新打開和比較? – Nadh

+1

請描述「filecmp.cmp」行引發的錯誤。 –

回答

1

如果這是你的實際代碼(或它的一部分),當你在if線所得到的錯誤可能是SyntaxError由於在該行的末尾缺少冒號(:)。

另外,我建議不寫實際的文件,然後使用filecmp來比較這些文件,但是讀你keyfile到字符串變量,寫你的file1到另一個字符串變量,然後比較這些變量。一旦你找到了正確的值i,你可以寫出實際的文件file1file2,而不是寫入(並覆蓋)它們達到上百次。

僞代碼:

with open("keyfile") as k: 
    keyfile = k.read() 
    for i in range(100, 0, -1): 
     file1 = # generate data based on the value of i 
     if keyfile == file1: 
      file2 = # generate data based on the value of i 
      with open("file1", "w") as p, open("file2", "w") as q: 
       # write file1 and file2 to actual files 
      print "%d is the correct value of it" % i 
      break 
0

對於第二個問題:with聲明將在if (filecmp ...行之前關閉2個文件,然後「file1」將被重新打開filecmp;在接下來的循環中,「file1」和「file2」將會被覆蓋。

順便說一句。您可能需要使用"wb"而不是中的"w"