簡體   English   中英

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

[英]How do I extract a row of a file in python?

我有一個連接到樹莓派的 rfid 閱讀器。 當我掃描卡片時,我將一個 UID 編號存儲在我的 python 文件中作為“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

預先感謝您審查我的問題。

類似下面的內容會將文件讀入腳本中的字典。

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() 時你都會得到什么。 查看文檔

這是我用來完成此操作的代碼..

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM