web-dev-qa-db-fra.com

Comparez deux fichiers différents ligne par ligne en python

J'ai deux fichiers différents et je veux comparer leur contenu ligne par ligne et écrire leur contenu commun dans un fichier différent. Notez que les deux contiennent des espaces vides. Voici mon pseudo code:

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()

Cependant, en faisant cela, j'ai beaucoup d'espaces vides dans mon fichierFO. On dirait que des espaces vides communs sont également écrits. Je veux écrire uniquement la partie texte. Quelqu'un peut-il m'aider s'il vous plaît. 

Par exemple: mon premier fichier (fichier1) contient des données:

Config:
Hostname = TUVALU

BT:
TS_Ball_Update_Threshold = 0.2

BT:
TS_Player_Search_Radius = 4

BT:
Ball_Template_Update = 0

tandis que le second fichier (fichier2) contient des données:

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

Tracking_ROI_Size = 4
Ball_Template_Update = 0

Si vous remarquez que les deux dernières lignes de chaque fichier sont identiques, je souhaite écrire ce fichier dans mon fichierFO. Mais le problème de mon approche est qu’il écrit également l’espace vide commun. Devrais-je utiliser regex pour ce problème? Je n'ai pas d'expérience avec regex.

20
Sanchit

Cette solution lit les deux fichiers en un seul passage, exclut les lignes vides et imprime les lignes communes quelle que soit leur position dans le fichier:

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)
56
Robᵩ

Encore un autre exemple ...

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)

Et si vous souhaitez éliminer les lignes vides communes, modifiez simplement l'instruction if en:

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

.strip() supprime tous les espaces de début et de fin; si c'est tout ce qui se trouve sur une ligne, cela devient une chaîne vide "", considérée comme fausse.

7
Wayne Werner

Si l'ordre est préservé entre les fichiers, vous pouvez également préférer difflib. Bien que le résultat de Robᵩ soit la norme standard pour les intersections, il se peut que vous recherchiez un type de diff similaire:

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="")

Cela dit, le comportement est différent de celui que vous avez demandé (l'ordre est important) même si, dans ce cas, le même résultat est produit.

4
Veedrac

Une fois que l'objet de fichier est itéré, il est examiné.

>>> f = open('1.txt', 'w')
>>> f.write('1\n2\n3\n')
>>> 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
...
>>>

Utilisez file.seek (ou fermez/ouvrez le fichier) pour rembobiner le fichier:

>>> f.seek(0)
>>> for line in f: print line
...
1

2

3
4
falsetru

Si vous cherchez spécifiquement à faire la différence entre deux fichiers, cela pourrait aider:

with open('first_file', 'r') as file1:
    with open('second_file, 'r') as file2:
        difference = set(file1).difference(file2)
#We can use intersection() method instead of difference() if we need to print the common items        

difference.discard('\n')

with open('diff.txt', 'w') as file_out:
    for line in difference:
        file_out.write(line)
1
itzmeesuvm

Essaye ça:

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"
0
Prashanth Babu

Je viens de faire face au même défi, mais je me suis dit "Pourquoi programmer cela en Python si vous pouvez le résoudre avec un simple" grep "?

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;

L'astuce derrière ceci est la suivante: grep -Fvf file1.txt file2.txt vérifie si toutes les entrées de file2.txt sont présentes dans file1.txt. En procédant ainsi dans les deux sens, nous pouvons voir si le contenu des deux fichiers est "égal". Je mets "égal" entre guillemets car les doublons ne sont pas pris en compte de cette façon.

Évidemment, ceci n’est qu’un exemple: vous pouvez remplacer grep par n’importe quel outil de comparaison de fichiers en ligne de commande.

0
Dominique