我有一个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。关于我需要改变什么的想法?
答案 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匹配,则按顺序执行以下操作:
\nuser1
附加到lock_log.csv Access Denied
已打印。如果backData与user2匹配,则按顺序执行以下操作:
Access Denied
已打印。\nuser2
附加到lock_log.csv 如果backData与之两者不匹配,则会按顺序执行以下操作:
Access Denied
已打印。Access Denied
。