Python циклически перебирает файл, чтобы сопоставить записи с пользовательским вводом - PullRequest
2 голосов
/ 18 февраля 2012

Я новичок в python (и в любом смысле) в программировании. Я поиграл с этой проблемой, и вот мое расширенное решение, чтобы неоднократно проверять файл белого списка, чтобы видеть, включены ли белые домены пользователя (по одному за раз). Файл белого списка содержит список доменов (по одному на запись).

Кажется, это работает, но я попал туда методом проб и ошибок. Можно ли сделать это более элегантным, эффективным и «питоническим» образом? Я еще не дошел до проверки ошибок (если это актуально). Любые советы с благодарностью получены.

#!/usr/bin/env python3
# Filename: whitelist.py

domain = 1
match = 0
while domain:
    domain = input('Enter a domain or press return to exit: ') 
    if not domain: # if return is pressed entered then end program
        break
    with open('whitelist.txt', 'r', encoding='utf-8') as whitelist:
        for recd in whitelist: 
            # if input domain doesn't match record read next record (continue)
            if recd.lower().rstrip() != domain.lower():  
                continue
            else: # otherwise if match set match indicator
                match = 1
            break # after setting indicator stop reading records

        if match:
            print('Match on domain: ', domain)                
        else:   
            print('No match on: ', domain)

После учета комментариев Ларсмана мое новое решение - это, по сути, его решение с небольшим изменением, чтобы все проверки использовали строчные буквы (например, cnn.com == CNN.com):

#!/usr/bin/env python3
# Filename: whitelist.py

with open('whitelist.txt', 'r', encoding='utf-8') as f:
    whitelist = set(line.lower().rstrip() for line in f) 

while True:
    domain = input('Enter a domain or press return to exit: ') 
    if not domain: 
        break

    if domain.lower() in whitelist:
        print('Match on domain: ', domain)                
    else:   
        print('No match on: ', domain)

1 Ответ

2 голосов
/ 18 февраля 2012
for recd in whitelist: 
    # if input domain doesn't match record read next record (continue)
    if recd.lower().rstrip() != domain.lower():  
        continue
    else: # otherwise if match set match indicator
        match = 1
    break # after setting indicator stop reading records

можно записать более кратко

for recd in whitelist:
    if recd.lower().rstrip() == domain.lower():
        match = 1
        break

Кроме того, вы должны использовать True и False для логических значений, а не 0 и 1.

В-третьих,Вы действительно должны читать файл белого списка один раз, вне цикла.В идеале вы должны прочитать его в set, чтобы обеспечить быстрый поиск.

with open("whitelist.txt") as f:
    whitelist = set(ln.rstrip() for ln in f)

Тогда цикл становится

while True:
    domain = input('Enter a domain or press return to exit: ')
    if not domain:
        break

    if domain in whitelist:
        print('Match on domain: ', domain)                
    else:   
        print('No match on: ', domain)

Обратите внимание, что я изменил условие цикла наwhile True потому что проверка на not domain уже происходит внутри него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...