2017-08-30 4 views
2

Je lis simultanément des lignes de deux fichiers texte avec le même contenu (une liste de mots).identité de 2 lignes à partir de 2 fichiers avec le même contenu en Python

peach 
carrot 
apple 
lemon 

Je veux vérifier si les deux lignes simultanées sont identiques. Si ce n'est pas le cas, la similarité totale diminue. Puisque les deux fichiers sont identiques, la vérification de l'identité devrait mener à une similitude de 100%. Au lieu de cela, je reçois 0%.

from itertools import izip, izip_longest 

with open(r'file1.txt', "rb") as f1, open(r'file2.txt', "rb") as f2: 

    #initialize numerator & denominator values for calculating file similarity 
    nTotal = 4 #total number of lines in each file 
    nIdent = nTotal 

    for line1, line2 in izip_longest(f1, f2): 

     if((line1 is line2) is False): 

      nIdent -=1 

    similarity = nIdent/nTotal 

Pourquoi les lignes ne sont pas identiques?

Répondre

4

Votre comparaison line1 is line2 est non la même chose que line1 == line2. Les objets sont pas le même, mais les données qu'ils représentent est.

equal_lines = 0 

with open(r'file1.txt', "rb") as f, open(r'file2.txt', "rb") as f2: 
    for f1_line, f2_line in zip(f.readlines(), f2.readlines()): 
     if f1_line == f2_line: 
      equal_lines += 1 
+0

+ pour simplifier le code –

2

Vous devez changer:

if((line1 is line2) is False): 

par:

if line1 == line2: 

Lorsque vous comparez string objets en Python vous ne pouvez pas utiliser l'opérateur is car dans la plupart de la mise en œuvre d'interprète les mêmes chaînes sont représentés comme des objets différents la plupart du temps.

is l'opérateur renvoie True si les objets que vous comparez sont identiques, et non si la valeur des objets est la même, étant ce dernier cas ce dont vous avez besoin.

Dans certaines chaînes de mise en œuvre de l'interpréteur littéraux avec la même valeur pourrait être terminée en œuvre partageant le même objet, mais ce n'est pas une chose que vous devez faire confiance dans vos scripts:

'abc' is 'abc' # True in CPython. 

L'exemple ci-dessus est totalement mise en œuvre dépendait et peut varier dans le futur. Vous devriez comparer les objets immuables par ses valeurs, et non par son identifiant d'objet (c'est ce que fait l'opérateur is).