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