2016-12-10 116 views
0

我需要一种自动获取C编程考试作弊者的方式。我想要做的第一件事是比较两个文件,并认为我可以将文件的行与另一个文件的所有行进行比较,如果等于则计数器接收+1。Python如何比较两个文件行

一个聪明的事情是忽略所有空间和{}但我不知道这样做的一个聪明的方式,我看到.replace()使性能真的很糟糕,任何其他解决方案?基本上我做了这么远,但没有工作,因为我想:

def line_compare(filename1, filename2): 
    counter = 0 
    result = {} 
    with open(filename1) as codefile1: 
     with open(filename2) as codefile2: 
      lines1 = codefile1.readlines() 
      lines2 = codefile2.readlines() 
      for line1 in lines1: 
       for line2 in lines2: 
        if line1 == line2: 
         counter += 1 
      key = filename1 + " " + filename2 
      result[key] = counter/len(lines1) 
    return result 

的字典的想法是把两个文件的名称为键和值是将可能复制的代码的百分比。它给了我很多错误的肯定,这是用python做这件事的最好方式吗?

+0

对不起,我想过clonedigger,但它不适用于C代码 – Gribouillis

+0

@Gribouillis克隆进程的C代码?他正在Python中编写一个剽窃检查器,但要比较C. – e0k

回答

0

关于空格和{},第一步可能需要使用代码美化器(例如astyle)重新格式化源文件。这将使两个程序完全相同的格式。 Astyle也可以执行小任务,例如删除评论。

0

试图通过检查各条线来查找复制粘贴的代码不是要走的路,原因有两个:(1)许多误报,如您注意到的 - 每条空行,每条if x:行等将显示为匹配,而这些不是问题的证据。然后(2)剽窃代码的一个非常简单的方法是为每一行添加一个小的但不相关的更改,比如通过在最后添加xxx来更改每个变量名称,或者甚至在每行添加额外的注释或空间!

您想要摆脱代码行,而是专注于代码的整体结构 - 在抽象语法树中寻找相似性可能会是一种更高效的方法。

+0

Python模块(如[pycparser](https://pypi.python.org/pypi/pycparser))应该能够为该脚本生成一个抽象语法树。 – Gribouillis

+0

'ast'模块会更简单。 –

+0

你认为'ast'可以处理C代码语法树吗? – Gribouillis