我有两个不同的文件,我想逐行比较它们的内容,并将它们的公共内容写在不同的文件中.请注意,它们都包含一些空格.这是我的伪代码:
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)
小智 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)
又一个例子......
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.
如果在文件之间保留顺序,则您也可能更喜欢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)
也就是说,这与您要求的行为不同(顺序很重要),即使在这种情况下也会产生相同的输出。