2016-11-09 49 views
0

我想在創建時使用附加的jpg文件發送電子郵件,然後刪除文件,而不在文件夾中留下任何jpg文件。文件的實際名稱將隨日期和時間而改變,但我不知道它是什麼。我試圖用這個如何在文件名中使用通配符將文件附加到使用python的電子郵件

#Email body 
rstime = datetime.datetime.now().strftime('%d %b %Y at %H:%M:%S') 
body = 'Picture saved of movement at front of house ' + str(rstime) 

msg.attach(MIMEText(body, 'plain')) 
fp = open('/mnt/usb/motion/*.jpg', 'rb') 
img = MIMEImage(fp.read()) 
fp.close() 
msg.attach(img) 

#remove file after emailing 
os.remove('/mnt/usb/motion/*.jpg') 

這給了我一個錯誤 - IO錯誤:[錯誤2]沒有這樣的文件或目錄:「/mnt/usb/motion/*.jpg」

什麼是錯的我的代碼?如果我輸入它的文件名,但我想用通配符。

+0

你會想要使用'glob'模塊。遍歷所有文件並逐個附加它們。通配符在Python中不會自動擴展(就像你的shell爲你做的那樣) – SuperSaiyan

回答

0

你不能以這種方式使用通配符。如果兩個文件匹配通配符會發生什麼?這兩個文件是否應該在同一個對象中打開?

您可以使用通配符與例如蟒蛇glob模塊:

import glob 
# Email body 
rstime = datetime.datetime.now().strftime('%d %b %Y at %H:%M:%S') 
body = 'Picture saved of movement at front of house ' + str(rstime) 

msg.attach(MIMEText(body, 'plain')) 
files = glob.glob("/mnt/usb/motion/*.jpg") 
firstFile = files[0] 
fp = open(firstFile, "rb"); 
img = MIMEImage(fp.read()) 
fp.close() 
msg.attach(img) 

# remove file after emailing 
os.remove(firstFile) 
+0

可以工作,而文件夾中不應該有兩個文件,這會發送第一個文件,一切正常。謝謝 – tamus

+0

它會發送第一個,因爲glob默認返回一個排序列表。在你的情況下,最老的時間戳將在列表的開頭 –

0

fnmatch

import fnmatch 
import os 

files = {} 
working_dir = '/mnt/usb/motion/' 

for filename in fnmatch.filter(os.listdir(working_dir), '*jpg'): 
    filepath = os.path.join(working_dir, filename) 
    files[filename] = open(filepath).read() 
    os.remove(filepath) 

看一看但是glob模塊看起來更好,雖然,因爲你不必join在這種情況下,文件的路徑和文件名。

+0

是的,謝謝 - 我喜歡glob模塊的建議,並一直在嘗試它,但無法獲得正確的語法。它給了另一種選擇,所以謝謝 – tamus

相關問題