Python循环遍历文件以匹配用户输入的记录

时间:2012-02-18 15:10:35

标签: python for-loop while-loop

我是python(在任何真正意义上)都是编程新手。我一直在玩this问题,这是我的扩展解决方案,重复检查白名单文件,看看用户输入域是否列入白名单(一次一个)。白名单文件包含域列表(每个记录一个)。

它似乎有效但我通过反复试验到达那里。这可以用更优雅,高效和“pythonic”的方式来完成吗?我还没有完成错误检查(如果这是相关的)。感谢任何提示。

#!/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)

在接受了larsmans的评论后,我的新解决方案基本上是他的解决方案,稍作修改,使所有支票都使用小写(例如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 个答案:

答案 0 :(得分:2)

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

此外,您应该使用TrueFalse来表示布尔值,而不是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内部已经检查过它。