比较两个文本文件并返回差异(不区分大小写)
我刚开始学习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)