如何知道传入数据是否等于 CSV 文件的最后一行第一列
How to know if the incoming data is equal to the last row, first column of a CSV file
我正在阅读 Raspberry Pi 上的一些 QR 码,并将这些数据写入 CSV 文件,但问题是,当收到数据时,它在 CSV 文件中被垃圾邮件,我的意思是,一旦检测到 QR 码,只要 QR 显示给 Cam,它就会继续在 CSV 上写入数据,我希望该数据只写入一次。
CSV 文件仅包含一个 header,表示 "Orders:"
。
我在 CSV 中写入数据、日期和时间,每一个都在一列中
我想到并尝试做但没有成功,是检查数据是否等于 CSV 文件最后一行的第一列,如果是则 pass
,否则写入数据,如下:
import csv
import cv2
cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()
from datetime import date, datetime
today = date.today()
date = today.strftime("%d-%b-%Y")
now = datetime.now()
timeRN = now.strftime("%H:%M:%S")
while True:
_, img = cap.read()
data, bbox, _ = detector.detectAndDecode(img)
if(bbox is not None):
for i in range(len(bbox)):
cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255,
0, 0), thickness=2)
cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,
1, (255, 250, 120), 2)
if 'OrderNr' in data:
with open('Orders.csv', mode='a+') as csvfile:
csvfileWriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
reader = readline()[-1]
lastRow = reader[-1]
firstColumn = reader[1]
if data in firstColumn:
pass
else:
csvfileWriter.writerow([data, date, timeRN])
a, b, c, d = data.split(',')
print("data: ", a)
print(b)
print(c)
print(d)
lcd_print(a, b, c, d) #just a method to print on LCD
pass
当我尝试这个时,我得到的是
lastRow = reader[-1]
IndexError: string index out of range
我在这里做错了什么?是我做错的方式吗?如果是,那么有没有其他方法或更简单的方法来做我想做的事情?
编辑: 代码已编辑
您可以保留一个始终保存最新数据的变量。如果新读取的数据等于那个,则忽略它,否则写入文件。
相关代码更改如下。
....
latest = None
while True:
_, img = cap.read()
data, bbox, _ = detector.detectAndDecode(img)
....
if 'OrderNr' in data:
with open('Orders.csv', mode='a+') as csvfile:
csvfileWriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
if data != latest:
csvfileWriter.writerow([data, date, timeRN])
latest = data
我正在阅读 Raspberry Pi 上的一些 QR 码,并将这些数据写入 CSV 文件,但问题是,当收到数据时,它在 CSV 文件中被垃圾邮件,我的意思是,一旦检测到 QR 码,只要 QR 显示给 Cam,它就会继续在 CSV 上写入数据,我希望该数据只写入一次。
CSV 文件仅包含一个 header,表示 "Orders:"
。
我在 CSV 中写入数据、日期和时间,每一个都在一列中
我想到并尝试做但没有成功,是检查数据是否等于 CSV 文件最后一行的第一列,如果是则 pass
,否则写入数据,如下:
import csv
import cv2
cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()
from datetime import date, datetime
today = date.today()
date = today.strftime("%d-%b-%Y")
now = datetime.now()
timeRN = now.strftime("%H:%M:%S")
while True:
_, img = cap.read()
data, bbox, _ = detector.detectAndDecode(img)
if(bbox is not None):
for i in range(len(bbox)):
cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255,
0, 0), thickness=2)
cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,
1, (255, 250, 120), 2)
if 'OrderNr' in data:
with open('Orders.csv', mode='a+') as csvfile:
csvfileWriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
reader = readline()[-1]
lastRow = reader[-1]
firstColumn = reader[1]
if data in firstColumn:
pass
else:
csvfileWriter.writerow([data, date, timeRN])
a, b, c, d = data.split(',')
print("data: ", a)
print(b)
print(c)
print(d)
lcd_print(a, b, c, d) #just a method to print on LCD
pass
当我尝试这个时,我得到的是
lastRow = reader[-1]
IndexError: string index out of range
我在这里做错了什么?是我做错的方式吗?如果是,那么有没有其他方法或更简单的方法来做我想做的事情?
编辑: 代码已编辑
您可以保留一个始终保存最新数据的变量。如果新读取的数据等于那个,则忽略它,否则写入文件。
相关代码更改如下。
....
latest = None
while True:
_, img = cap.read()
data, bbox, _ = detector.detectAndDecode(img)
....
if 'OrderNr' in data:
with open('Orders.csv', mode='a+') as csvfile:
csvfileWriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
if data != latest:
csvfileWriter.writerow([data, date, timeRN])
latest = data