比较Python中的文件内容

时间:2011-03-22 14:23:44

标签: python

我有两个文件,比如source和target。我比较源中的每个元素以检查它是否也存在于目标中。如果目标中不存在,我打印它(最终目标是0差异)。这是我写的代码。

def finddefaulters(source,target):
  f = open(source,'r')
  g = open(target,'r')

  reference = f.readlines()
  done = g.readlines()
  for i in reference:
    if i not in done:
      print i,

我需要帮助

  1. 如何按照1-10
  2. 的等级对此代码进行评级
  3. 如果文件很大,我怎样才能使它更好,更优化。
  4. 另一个问题 - 当我将所有行都读为列表元素时,它们被解释为'element \ n' - 因此,为了正确比较,我必须在每个文件的末尾添加换行符。有没有办法去除换行符,所以我不必在文件末尾添加换行符。我试过rstrip。但它没有用。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

一些想法:

1)使用[with]安全地打开文件:

with open(source) as f:
     .............
  

with语句用于包装   用方法执行块   由上下文管理器定义。这个   允许共同尝试......除了......最后   要封装的使用模式   方便重用。

2)你可以迭代文件的行而不是使用readlines:

for line in f:
     ..........

3)虽然对于这个简短的片段就足够了,但尝试为变量使用更多信息性的名称。不建议使用单字母名称。

4)如果你想获得python lib的利润,可以试试difflib模块中的函数。例如:

make_file(fromlines, tolines[, fromdesc][, todesc][, context][, numlines]) 
  

比较fromlines和tolines(列表   字符串)并返回一个字符串   是一个完整的HTML文件,包含一个   表格逐行显示差异   具有行间和行内更改   突出显示。

答案 1 :(得分:2)

关于效率:您展示的方法有asymptotic runtime complexity O(m*n)mn是{reference中的元素数量1}}和done,即如果你将两个列表的大小加倍,算法将运行4倍(对于理论计算机科学家来说,固定常数的一倍)。如果mn非常大,您可能希望选择更快的算法,例如,首先使用.sort()(运行时复杂度:O(n * log(n)))对两个列表进行排序,并且然后只浏览一次列表(运行时复杂度:O(n))。该算法的运行时复杂度最差为O(n * log(n)),这已经是一个很大的改进。但是,为了提高效率,您需要交换代码的可读性和简单性,因此我建议您在绝对必要的情况下执行此操作。

关于编码样式:您没有.close()您应该使用的文件句柄。您可以使用python的with language construct,而不是打开和关闭文件句柄。此外,如果您喜欢功能样式,可以使用列表表达式替换for循环:

for i in reference:
    if i not in done:
        print i,

然后变成:

items = [i.strip() for i in reference if i not in done]
print ' '.join(items)

但是,通过这种方式,您在撰写列表时不会看到任何进展。

正如joaquin已经提到的那样,您可以直接循环f而不是f.readlines(),因为文件句柄支持iterator protocol