我需要一种自动获取C编程考试作弊的方法。我要做的第一件事是比较两个文件,并认为我可以比较一个文件的行与另一个文件的所有行,如果等于,则计数器收到+1。
一件明智的事情就是忽略所有空格和{}
,但我不知道这样做的聪明方法,我发现.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
dict的想法是将两个文件的名称作为键,值是可能复制的代码的百分比。它给了我很多误报,这是在python中做到这一点的最好方法吗?
答案 0 :(得分:0)
关于空格和{},第一步可能涉及使用代码美化器(例如astyle)重新格式化源文件。这将为两个程序提供完全相同的格式。 Astyle还可以执行小任务,例如删除评论。
答案 1 :(得分:0)
通过检查单个行来尝试查找复制粘贴的代码不是可行的方法,原因有两个:(1)许多误报,如您所述 - 每个空行,每if x:
line等等将显示为匹配,并且这些不是问题的证据。然后(2)剽窃代码的一种非常简单的方法是向每一行添加一个小但无关的更改,比如通过在末尾添加xxx
来更改每个变量名,或者甚至只添加额外的注释或空格每一行!
您希望远离代码行,而是专注于代码的整体结构 - 在抽象语法树中寻找相似之处可能是一种更有效的方法。