[英]python code to get (latest) file with timestamp as name to attach to a e-mail
我有一个BASH脚本,用网络摄像头拍照。
#!/bin/bash # datum (in swedish) = date datum=$(date +'%Y-%m-%d-%H:%M') fswebcam -r --no-banner /home/pi/webcam/$datum.jpg
我有一个python代码来接收来自运动检测器的信号时运行BASH脚本,并调用发送电子邮件的模块
import RPi.GPIO as GPIO import time import gray_camera import python_security_mail GPIO.setmode(GPIO.BCM) GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) while True: if(GPIO.input (23)== 1): print('discovered!!!') gray_camera.camera() time.sleep(1) python_security_mail.mail() time.sleep(1.5) GPIO.cleanup()
和邮件代码:
import os
import smtplib
import userpass
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
def SendMail(ImgFileName):
img_data = open('/home/pi/solstol.png', 'rb').read()
msg = MIMEMultipart()
msg['Subject'] = 'subject'
msg['From'] = userpass.fromaddr
msg['To'] = userpass.toaddr
fromaddr = userpass.fromaddr
toaddr = userpass.toaddr
text = MIMEText("test")
msg.attach(text)
image = MIMEImage(img_data, name=os.path.basename('/home/pi/solstol.png'))
msg.attach(image)
s = smtplib.SMTP('smtp.gmail.com', 587)
s.ehlo()
s.starttls()
s.ehlo()
s.login(fromaddr, userpass.password)
s.sendmail(fromaddr, toaddr, msg.as_string())
s.quit()
我刚学会了如何将文件附加到电子邮件中。 该代码到目前为止工作。 但我想获取最新照片并附在电子邮件中。
我还只是Python的初学者。 这里的代码我大部分从各种教程中复制并改变了一点为我工作。 我对这一切都没有深刻的理解。 在一些部分,我可能有中级知识。 我不知道如何编写代码让python找到我想要的文件(jpg格式的照片)并将其附加到邮件中。
如果有人可以指导我如何填补缺失的部分,我很高兴。
我为邮件功能输入了错误的代码。 我用这个得到了更好的结果:
#!/usr/bin/python
import userpass
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import Encoders
import os
def send_a_picture():
gmail_user = userpass.fromaddr
gmail_pwd = userpass.password
def mail(to, subject, text, attach):
msg = MIMEMultipart()
msg['From'] = gmail_user
msg['To'] = userpass.toaddr
msg['Subject'] = subject
msg.attach(MIMEText(text))
part = MIMEBase('application', 'octet-stream')
part.set_payload(open(attach, 'rb').read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="%s"' % os.path.basename(attach))
msg.attach(part)
mailServer = smtplib.SMTP("smtp.gmail.com", 587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(gmail_user, gmail_pwd)
mailServer.sendmail(gmail_user, to, msg.as_string())
mailServer.close()
mail(userpass.toaddr,
"One step further",
"Hello. Thanks for the link. I am a bit closer now.",
"solstol.png")
send_a_picture()
编辑。
你好。 我现在已经添加了文件名的秒数。 如果在运行glob.glob(“/ home / pi / .jgp”)时文件夹中没有图片, 我得到:Traceback(最近一次调用最后一次):文件“”,第1行,在last_photo_taken = glob.glob(“ / home / pi / .jpg“)[ - 1] IndexError:列表索引超出范围。
当我拍照时,我得到了回报('/ home /pi/2017-01-16-23:39:46.jpg')。 如果我再拿另一张照片,那么回报仍然是'/home/pi/2017-01-16-23:39:46.jpg'。 如果我重新启动shell,我会得到下一张图片作为返回。 谢谢你今天的帮助。 我会写更多的tomorow。
您选择的格式'%Y-%m-%d-%H:%M'
具有良好的属性,可以按字母顺序或按日期顺序排列相同的排序顺序。
因此,由于您的文件位于/home/pi/webcam
并具有jpg扩展名,因此您可以像这样计算最后一张照片:
import glob
last_photo_taken = glob.glob("/home/pi/webcam/*.jpg")[-1]
将last_photo_taken
文件附加到您的电子邮箱中。
注意:在同一分钟拍摄的照片将重叠:最后一张照片会覆盖前一张照片。 您应该考虑在文件名中添加秒数。
注意:即使您的文件没有使用日期方便地命名,您也可以按修改日期对图像进行排序并选择最后一个:
last_photo_taken = sorted(glob.glob("/home/pi/webcam/*.jpg"),key=os.path.getmtime)[-1]
以下是列出特定文件夹中所有文件和文件夹的一些代码示例:
import os
files = os.listdir("myfolder")
这里有一种方法可以获取该列表并过滤与特定正则表达式匹配的名称(我使用了格式为YYYYMMDD-HHMM.jpg的文件名,但您可以更改它):
import re
jpgre = re.compile(r"\d{8}-\d{4}\.jpg")
jpgs = [s for s in files if jpgre.match(s)]
现在我们需要按日期/时间排序,因为列表是按任意顺序排列的。 请注意,我的所有文件名都是YYYYMMDD-HHMM.jpg形式,因此我们可以按日期/时间轻松对其进行排序,如下所示:
jpgs.sort()
最后,最新的JPG文件名是列表中的最后一个:
file = jpgs[-1]
希望这能让你开始。 请注意,我假设您可能在同一文件夹中有其他JPG,因此* .jpg列表可能会产生不需要的文件,这就是为什么我使用正则表达式匹配给出了一般解决方案。 如果你没有其他JPG,那么你可以使用glob (“folder / * .jpg”)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.