我是Python编程的新手,请原谅我,如果我的代码效率不高等等。我需要将文本文件B与文本文件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()
非常感谢提前
答案 0 :(得分: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)
答案 1 :(得分:1)
您可以将密钥设为大写:
def key(line):
return map(str.upper, line.strip().split()[0:2])
此外,代替file3 = open("file4.txt", "w")
和file3.close()
,
如果你的Python版本是2.5或更新,更好的方法是使用with
context manager:
with open("file4.txt", "w") as file3:
for line in filtered_lines(file1, file2):
file3.write(line)
这保证文件无论退出with-block如何都会被关闭,并确保您永远不会忘记拨打close()
。
答案 2 :(得分: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)