2016-11-09 16 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') 

это дает мне ошибку - IOError: [Errno 2] Нет такого файла или каталога: '/mnt/usb/motion/*.jpg'

Что не так с мой код? Если я вхожу в имя файла, он работает, но я хочу использовать его с подстановочным знаком.

+0

Вы хотите использовать модуль 'glob'. Перебирайте все файлы и присоедините их по одному. Экземпляры автоматически не разворачиваются в python (в том виде, в котором ваша оболочка делает это для вас) – 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