我将以下代码设置为创建电子邮件并附加文件然后发送。它就像一个魅力,但它总是在发送后给我一个错误的最后一个文件。几乎就像它试图两次完成最后一个文件一样。稍后在代码中我移动文件夹中的所有文件,这是我最初认为的问题,但是当我编写错误时捕获它是在这个段中的某个地方。
错误示例,当文件夹中只有一个文件时 - 错误[错误2]没有这样的文件或目录:'C:\ Users \ hlooman \ Desktop \ TestFolder \ ProccessedReports \〜$ TestFile1.xlsx'
path ='C:\Users\hlooman\Desktop\TestFolder\ProccessedReports'
extension = '.xlsx'
for filename in os.listdir(path):
if os.path.splitext(filename)[1] == extension:
try:
msg = MIMEMultipart()
msg['From'] = os.environ['TEST_EMAIL']
msg['To'] = os.environ['TEST_EMAIL']
msg['Subject'] = 'Formated Renewal Report'
message = 'Attached are the formated reports'
msg.attach(MIMEText(message))
with open(os.path.join(path, filename), "rb") as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(part)
mailserver = smtplib.SMTP('smtp.office365.com',587)
# identify ourselves to smtp gmail client
mailserver.ehlo()
# secure our email with tls encryption
mailserver.starttls()
# re-identify ourselves as an encrypted connection
mailserver.ehlo()
mailserver.login(os.environ['TEST_EMAIL'], os.environ['TEST_PASS'])
mailserver.sendmail(os.environ['TEST_EMAIL'],os.environ['TEST_EMAIL'],msg.as_string())
mailserver.quit()
except Exception as error2:
filepath = os.path.join(path, filename)
log.write(str(d) + " Error " + str(error2) + " occured during email creation of " + str(filepath))
log.write("\n")
log.close()
答案 0 :(得分:1)
而不是
path ='C:\Users\hlooman\Desktop\TestFolder\ProccessedReports'
extension = '.xlsx'
for filename in os.listdir(path):
if os.path.splitext(filename)[1] == extension:
# process file
您应该使用glob.glob,它更简单,更易读,并会过滤掉以~
开头的不需要的文件,如下所示:
from glob import glob
path = r'C:\Users\hlooman\Desktop\TestFolder\ProccessedReports'
for filename in glob(path + r'\[!~]*.xslx"):
# process files
glob模式匹配path
中以.xlsx
结尾的所有文件名,但不以~
开头。有关文件名模式匹配的详细信息,请参阅fnmatch module documentation。
如果要处理大量文件,可以使用glob.iglob执行相同操作,但返回迭代器而不是列表以节省内存。
您会注意到我使用前缀为r
的字符串:这些会取消\
等转义字符的特殊含义,这在处理Windows文件路径时会非常烦人。我在前一个例子中使用的双反斜杠是另一种解决这个问题的方法,虽然很笨拙。
我无法对它进行真正的测试,因为我既没有Windows机器也没有Excel,但这应该可以解决问题。如果需要澄清,请不要犹豫。