在python中逐行比较两个不同的文件
- 2025-03-17 09:09:00
- admin 原创
- 65
问题描述:
我有两个不同的文件,我想逐行比较它们的内容,并将它们的共同内容写入不同的文件中。请注意,它们都包含一些空格。这是我的伪代码:
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
" %(line1))
FO.close()
file1.close()
file2.close()
但是,这样做会导致我的FO文件中出现很多空白。似乎还写入了常见的空白。我只想写入文本部分。有人能帮帮我吗?
例如:我的第一个文件(file1)包含数据:
Config:
Hostname = TUVALU
BT:
TS_Ball_Update_Threshold = 0.2
BT:
TS_Player_Search_Radius = 4
BT:
Ball_Template_Update = 0
第二个文件(file2)包含数据:
Pole_ID = 2
Width = 1280
Height = 1024
Color_Mode = 0
Sensor_Scale = 1
Tracking_ROI_Size = 4
Ball_Template_Update = 0
如果您注意到,每个文件的最后两行是相同的,因此,我想将此文件写入我的FO文件中。但是,我的方法的问题是,它还会写入公共空格。我应该使用正则表达式来解决这个问题吗?我没有使用正则表达式的经验。
解决方案 1:
此解决方案一次性读取两个文件,排除空行,并打印公共行,无论它们在文件中的位置如何:
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('
')
with open('some_output_file.txt', 'w') as file_out:
for line in same:
file_out.write(line)
解决方案 2:
再举一个例子……
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)
如果要消除常见的空行,只需将 if 语句更改为:
if line1.strip() and line1 == line2:
.strip()
删除所有前导和尾随空格,所以如果一行中只有这些空格,它将变成一个空字符串""
,这被认为是错误的。
解决方案 3:
如果您专门想了解两个文件之间的差异,那么这可能会有所帮助:
with open('first_file', 'r') as file1:
with open('second_file', 'r') as file2:
difference = set(file1).difference(file2)
difference.discard('
')
with open('diff.txt', 'w') as file_out:
for line in difference:
file_out.write(line)
解决方案 4:
如果文件之间的顺序保持不变,您可能还会喜欢difflib
。尽管 Robᵩ 的结果是交叉点的真正标准,但您实际上可能正在寻找粗略的差异:
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="")
也就是说,即使在这种情况下产生了相同的输出,这与您要求的行为也不同(顺序很重要)。
解决方案 5:
一旦文件对象被迭代,它就被耗尽了。
>>> f = open('1.txt', 'w')
>>> f.write('1
2
3
')
>>> f.close()
>>> f = open('1.txt', 'r')
>>> for line in f: print line
...
1
2
3
# exausted, another iteration does not produce anything.
>>> for line in f: print line
...
>>>
使用file.seek
(或关闭/打开文件)后退文件:
>>> f.seek(0)
>>> for line in f: print line
...
1
2
3
解决方案 6:
尝试一下:
from __future__ import with_statement
filename1 = "G:\\test1.TXT"
filename2 = "G:\\test2.TXT"
with open(filename1) as f1:
with open(filename2) as f2:
file1list = f1.read().splitlines()
file2list = f2.read().splitlines()
list1length = len(file1list)
list2length = len(file2list)
if list1length == list2length:
for index in range(len(file1list)):
if file1list[index] == file2list[index]:
print file1list[index] + "==" + file2list[index]
else:
print file1list[index] + "!=" + file2list[index]+" Not-Equel"
else:
print "difference inthe size of the file and number of lines"
解决方案 7:
difflib
非常值得付出努力,并且能获得很好的浓缩输出。
from pathlib import Path
import difflib
mypath = '/Users/x/lib/python3'
file17c = Path(mypath, 'oop17c.py')
file18c = Path(mypath, 'oop18c.py')
with open(file17c) as file_1:
file1 = file_1.readlines()
with open(file18c) as file_2:
file2 = file_2.readlines()
for line in difflib.unified_diff(
file1, file2, fromfile=str(file17c), tofile=str(file18c), lineterm=''):
print(line)
输出
+...file18c 中存在的独特内容
-...file18c 中不存在但 file17c 中存在的内容
解决方案 8:
我刚刚面临同样的挑战,但我想“如果可以用简单的“grep”解决它,为什么还要用 Python 编程呢?”,这导致了以下 Python 代码:
import subprocess
from subprocess import PIPE
try:
output1, errors1 = subprocess.Popen(["c:\\cygwin\\bin\\grep", "-Fvf" ,"c:\\file1.txt", "c:\\file2.txt"], shell=True, stdout=PIPE, stderr=PIPE).communicate();
output2, errors2 = subprocess.Popen(["c:\\cygwin\\bin\\grep", "-Fvf" ,"c:\\file2.txt", "c:\\file1.txt"], shell=True, stdout=PIPE, stderr=PIPE).communicate();
if (len(output1) + len(output2) + len(errors1) + len(errors2) > 0):
print ("Compare result : There are differences:");
if (len(output1) + len(output2) > 0):
print (" Output differences : ");
print (output1);
print (output2);
if (len(errors1) + len(errors2) > 0):
print (" Errors : ");
print (errors1);
print (errors2);
else:
print ("Compare result : Both files are equal");
except Exception as ex:
print("Compare result : Exception during comparison");
print(ex);
raise;
背后的技巧如下:grep -Fvf file1.txt file2.txt
验证 file2.txt 中的所有条目是否都存在于 file1.txt 中。通过双向执行此操作,我们可以查看两个文件的内容是否“相等”。我将“相等”放在引号之间,因为在这种工作方式中重复的行会被忽略。
显然,这只是一个例子:您可以grep
用任何命令行文件比较工具来替换。
扫码咨询,免费领取项目管理大礼包!