为什么我的Python Dictionary只返回最后一个值?

时间:2016-04-27 19:58:08

标签: python dictionary raspberry-pi rfid

我有一个rfid阅读器,在扫描时返回一个UID为" backData"

我的用户(用户名和UID)存储在文本文件中。

我设法将文本文件读入python字典,但是当我扫描我的卡时,它只接受文本文件中的最后一个UID。

文字档案:

164 168 124 90 42, user1
114 156 203 196 225, user2

Python代码:

for line in uid_file:
    info = line.split(",")
    key = info[0]
    uname = info[1]
    c = len(uname)-1
    uname = uname[0:c]
    uid_dict[key] = uname
    USER = [int(i) for i in key.split()]

    if backData == USER:
        f = open("/mnt/lock_logs/lock_log.csv", "a");
        print f
        value = ('\n') + uname
        myString = str(value)
        f.write(myString)
        f.close()
     else:
        print "Access Denied"

因此,如果我扫描分配给user2的卡,它可以工作,但如果我扫描分配给user1的卡,我会被拒绝访问。

如果我打印变量USER,它将从文本文件中返回两个UID。关于我需要改变什么的想法?

2 个答案:

答案 0 :(得分:0)

我认为这是因为即使用户1匹配后你仍继续评估你的for循环。添加一个“休息”'在你的if语句的底部。

if backData == USER:
    f = open("/mnt/lock_logs/lock_log.csv", "a");
    print f
    value = ('\n') + uname
    myString = str(value)
    f.write(myString)
    f.close()
    break

我重新创建了您的文件,并能够使用以下代码获得预测的行为。不是我硬编码backData并且已经用两个USER列表成功地尝试了它。

filename = 'uid.txt'

with open(filename) as uid_file:
    uid_dict={}

    backData = [164, 168, 124, 90, 42]
    no_matches = True

    for line in uid_file:
        info = line.split(",")
        key = info[0]
        uname = info[1]
        print info[0], info[1]
        c = len(uname)-1
        uname = uname[0:c]
        uid_dict[key] = uname
        USER = [int(i) for i in key.split()]

        if backData == USER:
            print "user matches"
            no_matches = False          
            break

    if no_matches:
        print "Access Denied"

答案 1 :(得分:-1)

重新分析代码,我假设backData是一个数组,例如[114, 156, 203, 196, 225]

您的代码将循环遍历每一行,根据存储的密钥检查数组。它如果找到匹配就不会停止,并且每次匹配时都会打印拒绝访问(不完全相同,就好像它没有找到匹配一样。 )

更详细的解释:

如果backData与user1匹配,则按顺序执行以下操作:

  1. 已加载user1的数据。
  2. 根据user1的密钥检查backData,匹配。
  3. \nuser1附加到lock_log.csv
  4. 加载了user2的数据。
  5. 根据user2的密钥检查backData,而不是匹配。
  6. Access Denied已打印。
  7. 如果backData与user2匹配,则按顺序执行以下操作:

    1. 已加载user1的数据。
    2. 根据user1的密钥检查backData,而不是匹配。
    3. Access Denied已打印。
    4. 加载了user2的数据。
    5. 根据user2的密钥检查backData,匹配。
    6. \nuser2附加到lock_log.csv
    7. 如果backData与之两者不匹配,则会按顺序执行以下操作:

      1. 已加载user1的数据。
      2. 根据user1的密钥检查backData,而不是匹配。
      3. Access Denied已打印。
      4. 加载了user2的数据。
      5. 根据user2的密钥检查backData,而不是匹配。
      6. 再次打印
      7. Access Denied