python 获取(最新)文件的代码,将时间戳作为名称附加到电子邮件
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 脚本,当从运动检测器接收到信号时,还调用一个模块来发送 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").
我有一个 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 脚本,当从运动检测器接收到信号时,还调用一个模块来发送 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").