2015-07-23 2 views
4

Я пытаюсь получить разницу в двух файлах за строкой, а Python всегда возвращает false; даже когда я делаю разницу в тех же файлах, Python (почти) всегда возвращает false. Пример Goofy, но он реплицирует мою проблему на Python 3.4.3.Python '==' неверно возвращает false

file1.txt (example) 
1 
2 
3 

file1 = r"pathtofile\file1.txt" 
file2 = r"pathtofile\file1.txt" 
f1 = open(file1, "r") 
f2 = open(file2, "r") 

for line1 in f1: 
    found = False 
    for line2 in f2: 
     if repr(line1) == repr(line2): 
      found = True 
      print("true") 
    if found == False: 
     print("false") 

Python правильно идентифицирует, что первая строка одна и та же, но все после этого ложно. Может ли кто-нибудь еще повторить это? Есть идеи?

+3

Если вы не хотите 'if found == False:' всегда выполняться, yo u, вероятно, должен помещать 'found = True' в ваш код. – Kevin

+0

Вы пытаетесь определить, совпадают ли два файла или есть ли одна строка? Потому что вы можете использовать синтаксис 'for else' для этого, не требуя переменной' found'. – SuperBiasedMan

+1

Также Pythonic тестирует булевы с 'if bool' и' if not bool' – SuperBiasedMan

ответ

8

Вы исчерпали итератор после первой итерации свыше f2, вам нужно вернуть file.seek(0), чтобы вернуться в начало файла.

for line1 in f1: 
    found = False 
    for line2 in f2: 
     if repr(line1) == repr(line2): 
      print("true") 
    f2.seek(0) # reset pointer to start of file 

Вы только проверить первую строку f1 против линий f2, после первого цикла нет ничего перебирать.

В зависимости от того, что вы хотите совершить, вам необходимо указать break, если вы найдете строку, которая соответствует или же сбросит found = False во внутреннем цикле.

Если вам нужны все соответствующие строки, просто сохраните вывод в списке или если файлы не очень большие, вы можете использовать наборы, чтобы найти, чтобы найти общие строки.

with open("f1") as f1, open("f2") as f2: 
    st = set(f1) 
    common = st.intersection(f2) 

Если вы хотите разница использовать st.difference(f2), для линий в либо оба не в оба используют st.symmetric_difference(f2). Все зависит от того, что вы на самом деле хотите сделать.

Вы также можете проверить filecmp и difflib

2

Как Python читает файл, он на самом деле движется через файл как курсор. Как только он достигнет конца, у него больше нет текста для чтения. Вам будет лучше читать все f2 за один проход readlines. Это прочитает весь файл и сохранит его как список, где каждая строка является элементом списка. Затем вы можете перебирать его столько раз, сколько хотите.

file1 = r"pathtofile\file1.txt" 
file2 = r"pathtofile\file1.txt" 
f1 = open(file1, "r") 
f2 = open(file2, "r").readlines() 

for line1 in f1: 
    found = False 
    for line2 in f2: 
     if repr(line1) == repr(line2): 
      print("true") 
    if found == False: 
     print("false") 
2

В дополнение к другим ответам, если вы просто хотите, чтобы выяснить, если файлы одинаковы или нет, было бы логично, лучше сравнить линию файлов по линии, а не сравнивая 1-й линии в 1-ый файл со всеми линиями 2-го файла, а затем сравнивая 2-й линии в 1-й файл со всеми линиями 2-го файла и т.д. и т.п.

для этого примера можно использовать for-else пункт:

for line1, line2 in zip(f1, f2): 
    if line1 != line2: 
     print ("false") 
     break # found 2 different lines in the same place so the files can't be equal 
else: 
    print ("true") 
+2

Файлы, которые я использую, фактически не в том же порядке, но это отличное предложение, если они были идентичны. :) – 404usernotfound

Смежные вопросы