在Python中递归地比较文件

时间:2013-07-06 04:52:51

标签: python

我有一个用Python编写的代码。它根据变量'i'生成两个文件。现在,我需要将这两个生成的文件中的一个与密钥文件进行比较,以获得正确的“i”值。

我使用FOR循环测试'i'的一系列值,并使用filecmp.cmp将其中一个生成的文件与密钥文件进行比较。片刻我找到一个匹配,这意味着我有正确的'i'值。

以下是代码的一部分:

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循环。
  4. 我已将filecmp.cmp语句放在if语句中,因为如果两个文件相等则返回布尔值True。当我运行代码时,这一行会引发错误。

    另外,这是正确的做法吗?每次执行FOR循环时,它将生成两个文件,file1和file2。 with语句将在循环后关闭这两个文件。但是在下一轮循环中,这两个文件会被新内容覆盖吗?

    感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

对于您的第二个问题:with语句会在if (filecmp ...行之前关闭2个文件,然后filecmp将重新打开“file1”;在下一轮循环中,“file1”和“file2”将被覆盖。

顺便说一句。您可能需要在"wb"中使用"w"代替open()