在python中逐行比较两个不同的文件

San*_*hit 24 python file

我有两个不同的文件,我想逐行比较它们的内容,并将它们的公共内容写在不同的文件中.请注意,它们都包含一些空格.这是我的伪代码:

file1 = open('some_file_1.txt', 'r')
file2 = open('some_file_2.txt', 'r')
FO = open('some_output_file.txt', 'w')

for line1 in file1:
    for line2 in file2:
        if line1 == line2:
            FO.write("%s\n" %(line1))

FO.close()
file1.close()
file2.close()
Run Code Online (Sandbox Code Playgroud)

但是,通过这样做,我的FO文件中有很多空格.似乎也写了常见的空格.我只想写文本部分.有人能帮帮我吗.

例如:我的第一个文件(file1)包含数据:

Config:
Hostname = TUVALU

BT:
TS_Ball_Update_Threshold = 0.2

BT:
TS_Player_Search_Radius = 4

BT:
Ball_Template_Update = 0
Run Code Online (Sandbox Code Playgroud)

而第二个文件(file2)包含数据:

Pole_ID      = 2
Width        = 1280
Height       = 1024
Color_Mode   = 0
Sensor_Scale = 1

Tracking_ROI_Size = 4
Ball_Template_Update = 0
Run Code Online (Sandbox Code Playgroud)

如果你注意到,每个文件的最后两行是相同的,因此,我想在我的FO文件中写这个文件.但是,我的方法的问题是,它也编写了常见的空白区域.我应该使用正则表达式来解决这个问题吗?我没有正则表达式的经验.

Rob*_*obᵩ 69

此解决方案一次读取两个文件,排除空行,​​并打印公共行,无论它们在文件中的位置如何:

with open('some_file_1.txt', 'r') as file1:
    with open('some_file_2.txt', 'r') as file2:
        same = set(file1).intersection(file2)

same.discard('\n')

with open('some_output_file.txt', 'w') as file_out:
    for line in same:
        file_out.write(line)
Run Code Online (Sandbox Code Playgroud)

  • @BrettJ,使用.difference()或.symmetric_difference()方法可以使用此处列出的相同方法(只需替换'intersection'方法).您还可以使用difference_update()或symmetric_difference_update()方法从现有集中删除所有公共元素,而不是创建新元素. (4认同)
  • 我想知道,我将如何只保留不同的线条?顺便说一句很好的答案! (2认同)

小智 11

如果您专门寻找两个文件之间的差异,那么这可能会有所帮助:

with open('first_file', 'r') as file1:
    with open('second_file', 'r') as file2:
        difference = set(file1).difference(file2)

difference.discard('\n')

with open('diff.txt', 'w') as file_out:
    for line in difference:
        file_out.write(line)
Run Code Online (Sandbox Code Playgroud)


Way*_*ner 9

又一个例子......

from __future__ import print_function #Only for Python2

with open('file1.txt') as f1, open('file2.txt') as f2, open('outfile.txt', 'w') as outfile:
    for line1, line2 in zip(f1, f2):
        if line1 == line2:
            print(line1, end='', file=outfile)
Run Code Online (Sandbox Code Playgroud)

如果你想消除常见的空白行,只需将if语句更改为:

if line1.strip() and line1 == line2:

.strip()删除所有前导和尾随空格,因此,如果这就是一行,它将变为空字符串"",这被视为false.


Vee*_*rac 5

如果在文件之间保留顺序,则您也可能更喜欢difflib。尽管Rob?的结果是交叉口的善意标准,但您实际上可能正在寻找类似diff的粗糙方法:

from difflib import Differ

with open('cfg1.txt') as f1, open('cfg2.txt') as f2:
    differ = Differ()

    for line in differ.compare(f1.readlines(), f2.readlines()):
        if line.startswith(" "):
            print(line[2:], end="")
Run Code Online (Sandbox Code Playgroud)

也就是说,这与您要求的行为不同(顺序很重要),即使在这种情况下也会产生相同的输出。