2017-05-08 189 views
0

我是Python的初学者,我想比较两个文件。这里是我的想法:逐行比较两个文件,并将它们写入第三个文件,并进行比较。然后我想让输出更加清晰,我首先比较每个文件的行号,但是我发现在for循环之后,结果之一的第三个文件是空白的。如果我为这两个文件删除for循环,这没关系。这里是脚本:Python - for循环后的输出为空

import difflib 
import sys 
with open('file1','r') as file1: 
    with open ('file2','r') as file2: 
    line_num1=sum(1 for line in file1) 
    line_num2=sum(1 for line in file2) 
    diffInstance = difflib.Differ() 
    diffList = list(diffInstance.compare(file1.readlines(), file2.readlines())) 
    with open ('result', 'w') as result: 
    for i,line in enumerate(diffList): 
     result.write(line) 
    if line_num1 == line_num2: 
     if line.startswith('+'): 
     sys.stdout.write('Current-Line: {}, text: {}'.format(i-1,line)) 
     elif line.startswith('-'): 
     sys.stdout.write('Previous-Line: {}, text: {}'.format(i+1,line))      
    elif line_num1 > line_num2: 
     x = line_num1-line_num2 
    elif line_num1<line_num2: 
     y = line_num2-line_num1 
+2

建设有用的diff是一个实际上有一定数量的学术出版物的主题。您可以从http://dl.acm.org/citation.cfm?id=2554893或http://www.cs.man.ac.uk/~norm/papers/ssdbm08.pdf开始(尽管后面的调查工具如何在一些相当专业的数据集中工作)。如果你的目标仅仅是确定平等而不是识别变化,相反,“difflib”是非常重量级的(运行比必要的更多的CPU和内存密集型算法);我建议比较SAX风格的事件流以获得快速的是/否。 –

+0

谢谢,但我想知道为什么脚本不能正常工作 – Emily

回答

0

Charles Duffy的评论是非常有用的。然而,你的输出是空的,因为这些线路的,因为他们试图读取该文件的内容的两倍:

line_num1=sum(1 for line in xmlfile1) 
line_num2=sum(1 for line in xmlfile2) 

diffList = list(diffInstance.compare(xmlfile1.readlines(), xmlfile2.readlines())) 

要计算line_num1您正在阅读xmlfile1每一行,这意味着存储在xmlfile1是文件对象留下来提及文件的结尾。然后,您尝试使用xmlfile1.readlines()再次读取它,但xmlfile1没有更多行可读,因为它指向文件的末尾。

保持尽可能多的现有代码尽可能的,要调用的方法是seek()我们可以指示回到该文件的开始与0:XML文件

line_num1=sum(1 for line in xmlfile1) 
line_num2=sum(1 for line in xmlfile2) 
xmlfile1.seek(0) 
xmlfile2.seek(0) 
diffList = list(diffInstance.compare(xmlfile1.readlines(), xmlfile2.readlines())) 
+0

谢谢西蒙,它解决了我的问题:) – Emily