我正在尝试比较python中的两个文件,它实际上是在将它与旧警告文件进行比较后尝试查找新警告。
旧文件的内容是这样的:
warning1~file1
warning1~file1
warning2~file2
warning2~file2
warning2~file2
和新文件的内容是这样的
warning1~file1
warning1~file1
warning1~file1
warning3~file3
warning2~file2
warning2~file2
warning2~file2
正如你所看到的,在新文件中我有2个新的文本行warning1~file1 warning3~file3,我搜索了通过互联网比较两个文件,但他们认为每个文本行都不同。
small_file = open('file1','r')
long_file = open('file2','r')
output_file = open('newfile','w')
try:
small_lines = small_file.readlines()
small_lines_cleaned = [line.rstrip().lower() for line in small_lines]
long_lines = long_file.readlines()
long_lines_cleaned = [line.rstrip().lower() for line in long_lines]
#for line in long_lines_cleaned:
for line in long_lines_cleaned:
if line not in small_lines_cleaned:
output_file.writelines(line)
我尝试了这个我在这里找到的代码,但在运行之后,意识到它也只是检查file1中的一行是否在file2中可用。如果没有,则写入新文件。 此方法仅获取warning3,而不是新的warning1。
我需要一些东西,每行只比较一次......并且左边的行被写入新文件。
我希望我已正确解释了这个问题。
答案 0 :(得分:2)
我会使用Counter
来查找出现次数的差异,ep>
from collections import Counter
with open('file1', 'r') as f1, open('file2', 'r') as f2, open('newfile', 'w') as output:
f1_lines = [line.rstrip().lower() for line in f1.readlines()]
f2_lines = [line.rstrip().lower() for line in f2.readlines()]
diff = Counter(f2_lines) - Counter(f1_lines)
for msg, n in diff.iteritems():
output.writelines((msg + '\n') * n)