比较两个文本文件并返回差异(不区分大小写)

0 投票
3 回答
1600 浏览
提问于 2025-04-17 10:09

我刚开始学习Python编程,所以如果我的代码不够高效,请多多包涵。我需要把文本文件A和文本文件B进行比较,然后把结果输出到另一个文件。简单来说,结果C = 文本文件A - 文本文件B。

我有以下代码可以运行,但是因为大小写的问题,结果中出现了重复的内容。我该怎么做才能让我的程序在比较时不区分大小写呢?

#!/usr/local/bin/python -u

file1='A_GAGL.txt'
file2='B_GGL.txt'

def key(line):
  return tuple(line.strip().split()[0:2])

def make_key_set(file_path):
  return set(key(line) for line in open(file_path))


def filtered_lines(file_path1, file_path2):
  key_set = make_key_set(file_path2)
  return (line for line in open(file_path1) if key(line) not in key_set)

if __name__ == "__main__":
  file3 = open("file4.txt", "w")
  for line in filtered_lines(file1, file2):
      file3.write(line)
  file3.close()

非常感谢!

3 个回答

1

如果你的文件是以行作为单位的纯文本,那么:

 class HashableDictWrapper(object):
    def __init__(self, s):
        self.original_str = s
        self._hash_key = hash(s.strip()[0:2].lower())

    def __hash__(self):
        return self._hash_key

    def __eq__(self, other):
        return self.__hash__()==other.__hash__()

 if __name__=="__main__":
    a = map(HashableDictWrapper, open("A.txt"))
    b = map(HashableDictWrapper, open("B.txt"))
    result = map(lambda x:x.original_str, set(a) - set(b))
    open("C.txt", "w").writelines(result)
1

你可以把你的键(key)改成大写:

def key(line):
    return map(str.upper, line.strip().split()[0:2])

另外,如果你用的是2.5版本或更新的Python,别再用 file3 = open("file4.txt", "w")file3.close() 这种写法了,推荐使用 with 上下文管理器

with open("file4.txt", "w") as file3:
    for line in filtered_lines(file1, file2):
        file3.write(line)

这样做可以确保文件在退出这个上下文时会自动关闭,避免你忘记调用 close() 的情况。

1

make_key_set 这个函数里,把所有的字母都变成小写:

return set(key(line.lower()) for line in open(file_path)

然后在 filtered_lines 里检查一下这个小写的行是否在 key_set 里面(但是要返回原来的大小写形式):

return (line for line in open(file_path1) if key(line.lower()) not in key_set) 

撰写回答