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

2025-03-17 09:09:00
admin
原创
66
摘要:问题描述:我有两个不同的文件,我想逐行比较它们的内容,并将它们的共同内容写入不同的文件中。请注意,它们都包含一些空格。这是我的伪代码:file1 = open('some_file_1.txt', 'r') file2 = open('some_file_2.txt', 'r') FO = open('som...

问题描述:

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

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用任何命令行文件比较工具来替换。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用