我是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)
答案 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
此外,您应该使用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
内部已经检查过它。