【问题标题】:Select a random file from a directory and send it (Python, MIME)从目录中选择一个随机文件并发送它(Python,MIME)
【发布时间】:2019-05-12 05:48:36
【问题描述】:

我正在开发一个 python 程序,它从目录中随机选择一个文件,然后使用email.mimemodule 将其发送给您。我有一个问题,我可以选择随机文件,但由于此错误而无法发送:

 File "C:\Users\Mihkel\Desktop\dnak.py", line 37, in sendmemeone
    attachment  =open(filename, 'rb')
TypeError: expected str, bytes or os.PathLike object, not list

代码如下:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import  MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os
import random

path ='C:/Users/Mihkel/Desktop/memes'
files = os.listdir(path)
index = random.randrange(0, len(files))
print(files[index])

def send():
    email_user = 'yeetbotmemes@gmail.com'
    email_send = 'miku.rebane@gmail.com'
    subject = 'Test'
    msg = MIMEMultipart()
    msg['From'] = email_user
    msg['To']   = email_send
    msg['Subject'] = subject
    body = 'Here is your very own dank meme of the day:'
    msg.attach(MIMEText (body, 'plain'))
    filename=files
    attachment  =open(filename, 'rb')
    part = MIMEBase('application','octet-stream')
    part.set_payload((attachment).read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition',"attachment; 
    filename= "+filename)
    msg.attach(part)
    text = msg.as_string()
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.starttls()
    server.login(email_user,"MY PASSWORD")
    server.sendmail(email_user,email_send,text)
    server.quit()

我相信它只是将文件名作为选定的随机选项,我怎样才能让它选择文件本身?

编辑:进行建议的更改后,我现在收到此错误:

File "C:\Users\Mihkel\Desktop\e8re.py", line 29, in send
    part.add_header('Content-Disposition',"attachment; filename= "+filename)
TypeError: can only concatenate str (not "list") to str

似乎这部分仍在列表中,我该如何解决?

【问题讨论】:

  • 我不太明白你的问题,但错误信息很明显:open 需要一个字符串,它代表一个文件名,包括它的路径。但是在您的程序中filename 是几个字符串的列表,因为filename=filesfiles 是目录的内容:files = os.listdir(path) 所以filename=files[index] 可能会更正您的脚本

标签: python file random directory mime-mail


【解决方案1】:

您选择一个随机文件然后将其丢弃(好吧,您打印它,然后将其丢弃):

files = os.listdir(path)
index = random.randrange(0, len(files))
print(files[index])

(顺便说一句,你可以用random.choice(files) 做)

当调用open 时,你会将整个files 列表传递给它:

filename = files
attachment  = open(filename, 'rb')

改为传递open您选择的文件:

attachment  = open(random.choice(files), 'rb')

但是,这仍然行不通,因为listdir 只返回文件名而不是完整路径,因此您需要将其取回,最好使用os.path.join

attachment  = open(os.path.join(path, random.choice(files)), 'rb')

【讨论】:

  • 谢谢,最后一段代码正是我要找的。抱歉这个愚蠢的问题,我写了我在问题中的代码后真的不知道该怎么做
  • 实际上,我在进行更改后遇到了一个新错误,我更新了问题
  • @Mihkel 这是完全相同的错误。您的代码中的filename 仍然是一个列表! can only concatenate str (not "list") to str 表示 2 之一是列表。 "attachment; filename= " 显然是一个字符串,也就是说filename 是一个列表
  • 谢谢你的解释,让它更容易理解。很抱歉浪费您的时间,现在第一次赶上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多