寻找更好的解决方案我的脚本(python)

时间:2014-08-27 05:48:54

标签: python

所以我不确定如何在搜索中说出这个,所以我会告诉你细节。  我正在使用nfc阅读器,如果找到了卡片,则会执行操作。我想要做的是添加一个部分,如果卡不在数据库中打印"未知卡"

基本上是我的脚本。 max =文本文件中的行总和 cardid = card uid#

for i in range(max)
    with open(....) as file
        card = file.readlines()[i]
    if cardid == card
        print "card found"

这就是我到目前为止所拥有的。它按预期工作。我能看到的唯一解决方法是添加一个变量' cardfound'这样做

cardfound = 0
for i in range(max)
    with open(....) as file
        card = file.readlines()[i]
    if cardid == card
        print "card found"
        cardfound = 1
if cardfound == 0
     print "unknown card"

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

首先,你一遍又一遍地阅读文件。阅读一次就足够了。

至于其他语言 - 在大多数语言中,你必须基本上做你所做的事情,如果你发现了某些东西,就会在某个地方有一个标记。但是,Python有一个很酷的for...else形式:

with open(....) as file:
    for card in file.readlines():
        if card == cardid:
            print "OKAY!!!"
            break
    else:
        print "Sad now."

答案 1 :(得分:2)

我认为如果找到卡片,您是否需要继续处理该文件?在这种情况下,您可以这样做:

with open(....) as file
    for card in file.readlines()
        if cardid == card
            print "card found"
            break
    else:
        print "unknown card"

请注意,with open()行不在循环中,您并不是每次都想要打开文件。此外,您可以取消range(max),因为file是可迭代的。

如果您确实要处理整个文件(例如计算找到的卡片数量,那么您使用它的方式可能是最好的,尽管使用布尔值会更好:

cardfound = False
with open(....) as file
    for card in file.readlines()
        if cardid == card
            print "card found"
            cardfound = True
if not cardfound:
     print "No card found"

更新如果您想计算行数,而不是手动迭代每行,请使用enumerate计算:

cardfound = False
with open(....) as file
    for i, card in enumerate(file.readlines())
        if cardid == card
            print "card found on line %d" % i
            cardfound = True
if not cardfound:
     print "No card found"

答案 2 :(得分:0)

显式地循环显示列表的行可以用in运算符替换。

with open(...) as file:
    cards = file.readlines()
if card in cards:
    print('card found')
else:
    print('unknown card')

您可能想要删除' \ n'从每行的末尾,用以下代码替换上面代码的第二行:

cards = [line.strip() for line in file]

最后,如果您只需要加载一次卡片列表并对其进行多次检查,请使用set代替listin运行得更快):< / p>

cards = set(line.strip() for line in file)