为什么我的 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 匹配,将依次发生以下情况:
- user1 的数据已加载。
- 根据 user1 的密钥检查 backData,匹配。
\nuser1
附加到 lock_log.csv
- 用户 2 的数据已加载。
- 根据 user2 的密钥检查了 backData,不匹配。
Access Denied
被打印出来。
如果 backData 与 user2 匹配,将依次发生以下情况:
- user1 的数据已加载。
- 根据 user1 的密钥检查 backData,不匹配。
Access Denied
被打印出来。
- 用户 2 的数据已加载。
- 根据 user2 的密钥检查 backData,匹配。
\nuser2
附加到 lock_log.csv
如果 backData 两者都不匹配,将依次发生以下情况:
- user1 的数据已加载。
- 根据 user1 的密钥检查 backData,不匹配。
Access Denied
被打印出来。
- 用户 2 的数据已加载。
- 根据 user2 的密钥检查了 backData,不匹配。
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"
我有一个 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 匹配,将依次发生以下情况:
- user1 的数据已加载。
- 根据 user1 的密钥检查 backData,匹配。
\nuser1
附加到 lock_log.csv- 用户 2 的数据已加载。
- 根据 user2 的密钥检查了 backData,不匹配。
Access Denied
被打印出来。
如果 backData 与 user2 匹配,将依次发生以下情况:
- user1 的数据已加载。
- 根据 user1 的密钥检查 backData,不匹配。
Access Denied
被打印出来。- 用户 2 的数据已加载。
- 根据 user2 的密钥检查 backData,匹配。
\nuser2
附加到 lock_log.csv
如果 backData 两者都不匹配,将依次发生以下情况:
- user1 的数据已加载。
- 根据 user1 的密钥检查 backData,不匹配。
Access Denied
被打印出来。- 用户 2 的数据已加载。
- 根据 user2 的密钥检查了 backData,不匹配。
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"