python 获取(最新)文件的代码,将时间戳作为名称附加到电子邮件

python code to get (latest) file with timestamp as name to attach to a e-mail

  1. 我有一个 BASH 使用网络摄像头拍照的脚本。

    #!/bin/bash
    
    # datum (in swedish) = date
    
    datum=$(date +'%Y-%m-%d-%H:%M')
    
    fswebcam -r --no-banner /home/pi/webcam/$datum.jpg
    
  2. 我有一个 python 代码来执行 运行 BASH 脚本,当从运动检测器接收到信号时,还调用一个模块来发送 e -邮件

    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()  

编辑。

您好。我现在已经在文件名中添加了秒数。如果在 运行ning glob.glob("/home/pi/.jgp") 时文件夹中没有图片,我得到: 追溯(最近一次通话): 文件“”,第 1 行,位于 last_photo_taken = glob.glob("/home/pi/.jpg")[-1] IndexError:列表索引超出范围。

当我拍照时,我得到了 return ('/home/pi/2017-01-16-23:39:46.jpg')。 如果我再拍另一张照片,return 仍然是“/home/pi/2017-01-16-23:39:46.jpg”。 如果我重新启动 shell,我会得到下一张照片 return。谢谢你今天的帮助。明天再写。

您选择的格式 '%Y-%m-%d-%H:%M' 具有良好的 属性 相同的字母排序顺序或 date-wise.

因此,由于您的文件位于 /home/pi/webcam 并具有 jpg 扩展名,因此您可以这样计算最后一张照片:

import glob
last_photo_taken = glob.glob("/home/pi/webcam/*.jpg")[-1]

last_photo_taken 文件附加到您的 e-mail。

注意:同一分钟拍摄的照片会重叠:最后一张照片会覆盖前一张照片。您应该考虑在文件名中添加秒数。

注意:即使您的文件没有方便地用日期命名,您也可以按修改日期对图像进行排序并取最后一张:

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)]

现在我们需要按 date/time 排序,因为列表是任意顺序的。请注意,我所有的文件名都是 YYYYMMDD-HHMM.jpg 格式,因此我们可以很容易地按 date/time 排序,如下所示:

jpgs.sort()

最后,最新的 JPG 文件名是列表中的最后一个:

file = jpgs[-1]

希望这能让您入门。请注意,我假设您可能在同一文件夹中有其他 JPG,因此 *.jpg 列表可能会产生不需要的文件,这就是为什么我使用正则表达式匹配给出了一个通用解决方案。如果您没有其他 JPG,则可以使用 glob("folder/*.jpg").