如何在python中提取一行文件?

时间:2016-04-20 14:40:06

标签: python csv raspberry-pi

我有一个rfid阅读器连接到树莓派。当我扫描一张卡片时,我得到一个存储在我的python文件中的UID号码为“backData”我想将所有用户存储在一个单独的文件中(IE:csv或txt文件),而不是我的代码顶部然后读取该文件以进行身份​​验证并提取相关行。我目前的python代码如下:

user1 = [1,23,45,678,987]
user2 = [9,87,65,432,123]

if  backData == user1:
  f = open("/mnt/lock_logs/lock_log.csv", "a");
  print f
  value = ('\n' 'user1,FOB,') + (',') + time.strftime("%c")
  myString = str(value)
  f.write(myString)
  f.close()
  GPIO.digitalWrite(RELAY, GPIO.HIGH)
  GPIO.digitalWrite(LEDBLUE, GPIO.LOW)
  GPIO.digitalWrite(LEDGREEN, GPIO.HIGH)
  print "Access Granted"
  time.sleep(1)
  GPIO.digitalWrite(RELAY, GPIO.LOW)
  time.sleep(3)
  GPIO.digitalWrite(LEDGREEN, GPIO.LOW)
  GPIO.digitalWrite(LEDBLUE, GPIO.HIGH)

所以理想情况下,我会读取一个csv文件,找到UID,然后将该行打印到日志中。 csv文件看起来像这样。

[1,23,456,78,987], Full Name

提前感谢您审核我的问题。

2 个答案:

答案 0 :(得分:0)

下面的内容会将文件读入脚本中的dict。

import csv

users = {}
with open('users.csv', 'r') as fp:
    reader = csv.reader(fp)
    for row in reader:
       id = row[0][1:-1].split(',')
       name = row[1]
       users[id] = name

这将为你建立一个名字的ID。但老实说,为什么不只是使用json和dump()/ load()作为一个整体的文件?是否被其他程序或服务使用?你的主要困难是将文本表示转换为数据表示,像json那样的格式,为什么不使用它们?

如果它是json格式,它将是:

import json

users = {}
with open('users.json', 'r') as fp:
   users = json.load(fp)

与我在第一个版本中做出的假设相比,它更不容易出错。一旦加载,生成的users看起来像这样:

{
    [1,23,45,678,987]: 'name1', 
    [9,87,65,432,123]: 'name2'
}

所以要得到用户:

if users.get(backData, None) in ('name1', 'name2'):
    #stuff

if users.get(backData, None) is not None:
    #stuff

json只是一种序列化格式。因此,无论您调用dump()的数据结构是什么,都会在调用load()时获得。查看docs

答案 1 :(得分:0)

以下是我用来完成此任务的代码..

uid_dict = dict()
uid_file = "/mnt/lock_logs/users.txt"
log_file = "/mnt/lock_logs/lock_log.csv"
fieldnames = ['UUID', 'USERS']

# UID DICTIONARY
with open(uid_file, "r") as f:
  reader = csv.DictReader(f, fieldnames=fieldnames, delimiter=",")
  for row in reader:
    uid_dict[row['USERS'].strip()] = [int(i) for i in row['UUID'].split()]

  for key, value in uid_dict.iteritems():
    if backData == value:
      with open(log_file, "a") as f:
        f.write(key + "\n")        
      GPIO.output(RELAY, GPIO.HIGH)
      time.sleep(1)
      GPIO.output(RELAY, GPIO.LOW)
      break