[英]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.