Comparer deux fichiers ligne par ligne en python

j'ai deux fichiers différents et je veux comparer leur contenu ligne par ligne et d'écrire leur commun contenu 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("%sn" %(line1))

FO.close()
file1.close()
file2.close()

Cependant, en faisant cela, j'ai eu beaucoup d'espaces vides dans mon FO fichier. On dirait que des espaces vides sont aussi écrits. Je ne veux écrire que la partie texte. Quelqu'un peut-il m'aider.

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, les deux dernières lignes de chaque fichiers sont les mêmes, donc, je veux écrire ce fichier dans mon FO fichier. Mais, le problème avec mon approche est que, il écrit l'espace vide commun aussi. Devrais-je utiliser regex pour ce problème? Je n'ai pas d'expérience avec les regex.

17
demandé sur Sanchit 2013-09-25 18:13:56

7 réponses

cette solution lit les deux fichiers en une seule passe, exclut les lignes vierges, et imprime des 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)
51
répondu Robᵩ 2014-12-04 15:36:24

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 voulez éliminer les lignes vides, il suffit de modifier l'instruction if:

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

.strip() supprime tous les espaces blancs menant et traînant, donc si c'est tout ce qui est sur une ligne, il deviendra une chaîne vide "", qui est considéré comme faux.

6
répondu Wayne Werner 2013-09-25 14:52:56

une fois que l'objet file est itéré, il est exausté.

>>> 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
...
>>>

Utiliser file.seek (ou fermer/ouvrir le fichier) pour rembobiner le fichier:

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

2

3
5
répondu falsetru 2013-09-25 14:25:18

Si l'ordre est conservé entre les fichiers, vous pouvez aussi préférer difflib. Bien que le résultat de Rob est la norme authentique pour les intersections, vous pourriez en fait être à la recherche d'un diff-like grossier:

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, ceci a un comportement différent de ce que vous avez demandé (l'ordre est important) même si dans ce cas la même sortie est produite.

4
répondu Veedrac 2013-09-25 14:45:45

si vous cherchez spécifiquement à obtenir la différence entre deux fichiers, alors 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
répondu itzmeesuvm 2018-03-13 06:51:00

je viens de faire face au même défi, mais j'ai pensé "pourquoi programmer ceci en Python Si vous pouvez le résoudre avec un simple "grep"?, qui a conduit au code Python suivant:

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;

le truc derrière ceci est le suivant: grep -Fvf file1.txt file2.txt vérifie si toutes les entrées dans fichier2.txt sont présents dans fichier1.txt. En faisant cela dans les deux sens, nous pouvons voir si le contenu des deux fichiers est "égal". J'ai mis "égal" entre les guillemets parce que les lignes dupliquées sont négligées de cette façon travailler.

Évidemment, c'est juste un exemple: vous pouvez remplacer grep par n'importe quel outil de comparaison de fichiers en ligne de commande.

0
répondu Dominique 2015-10-15 07:53:51

essaye ceci:

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
répondu Prashanth Babu 2017-01-16 21:06:38