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

Why is my Python Dictionary only returning the last value?

我有一个 rfid reader,扫描后 returns 一个 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,它 returns 来自文本文件的两个 UID。关于我需要更改的内容有什么想法吗??

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

您的代码将遍历每一行,根据存储的键检查数组。如果找到匹配项,它不会停止,并且每次不匹配时都会打印 Access Denied(与完全没有找到匹配项 不同)。

更详细的解释:

如果 backData 与 user1 匹配,将依次发生以下情况:

  1. user1 的数据已加载。
  2. 根据 user1 的密钥检查 backData,匹配。
  3. \nuser1 附加到 lock_log.csv
  4. 用户 2 的数据已加载。
  5. 根据 user2 的密钥检查了 backData,不匹配。
  6. Access Denied 被打印出来。

如果 backData 与 user2 匹配,将依次发生以下情况:

  1. user1 的数据已加载。
  2. 根据 user1 的密钥检查 backData,不匹配。
  3. Access Denied 被打印出来。
  4. 用户 2 的数据已加载。
  5. 根据 user2 的密钥检查 backData,匹配。
  6. \nuser2 附加到 lock_log.csv

如果 backData 两者都不匹配,将依次发生以下情况:

  1. user1 的数据已加载。
  2. 根据 user1 的密钥检查 backData,不匹配。
  3. Access Denied 被打印出来。
  4. 用户 2 的数据已加载。
  5. 根据 user2 的密钥检查了 backData,不匹配。
  6. Access Denied 又打印出来了。

我认为这是因为即使在匹配到用户 1 之后,您仍继续评估您的 for 循环。在 if 语句的底部添加 'break'。

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"