2015-10-12 2 views
1

Я пытаюсь сделать следующее в python. Прочитайте файл xml с именами пользователей, pw, адресами электронной почты и так далее. Затем я хочу перебирать пароли и пытаться найти их в другом файле. если есть совпадение, распечатайте имя пользователя и пароль. это то, что я до сих пор:Python скрипт прерывается после первой итерации

import xml.etree.ElementTree as ET 

tag = "multiRef" 


tree = ET.parse('user.xml') 
pwlist = open('swapped.txt', 'r') 

for dataset in tree.iter(tag): 
    password = dataset.find("password") 
    pw = password.text 
    user = dataset.find("username").text 
    if pw in pwlist.read(): 
     print user 
     print pw 

К сожалению, скрипт печатает только один результат и заканчивается без ошибок или что-нибудь. Я знаю, что должно быть не менее 250 результатов ... Почему это останавливается после одного результата? Абсолютный python newb, подробное объяснение было бы очень оценено!

+0

Как выглядит пользователь. Xml? – wastl

+0

Чтобы помочь, я должен уметь воспроизвести это. Не могли бы вы предоставить образец анализируемого xml (минимальный пример с арендой двух подходящих элементов в правильной структуре был бы достаточным). – iLoveTux

+0

Сколько xml-элементов существует с тегом '' multiRef'', вы действительно ищете список элементов под '' multiRef''? – AChampion

ответ

1

Ошибка в том, что вы вызываете чтение на каждой итерации. После одного чтения вы должны вызвать .seek(0), чтобы сбросить указатель. Это, однако, это не самое лучшее решение для этого, так что вы можете попробовать что-то вроде этого:

import xml.etree.ElementTree as ET 

tag = "multiRef" 


tree = ET.parse('user.xml') 
with open('swapped.txt', 'r') as fin: 
    pwlist = fin.read() 

for dataset in tree.iter(tag): 
    password = dataset.find("password") 
    pw = password.text 
    user = dataset.find("username").text 
    if pw in pwlist: 
     print user 
     print pw 

Таким образом, вы только читать файл один раз и закрыть его после (с помощью context manager). Вы можете найти дополнительную информацию о работе с файлами в Python here.

+0

спасибо! это очень помогло – simplex123

1

if pw in pwlist.read() не должно находиться внутри петли. В первый раз через цикл read() вернет весь файл. Второй раз через него ничего не вернется, потому что вы находитесь в КОНЕЦ ФАЙЛА.

Прочитайте содержимое в списке до цикла, а затем обратитесь к списку внутри цикла.

Также рассмотрите шаблон with open(...) as f, чтобы убедиться, что вы закрываете файл, так как я не вижу явного закрытия().

with open('swapped.txt', 'r') as f: 
    pw_list = f.readlines() 

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