Python 关闭csv以删除它时出现问题

Python 关闭csv以删除它时出现问题,python,operating-system,smtplib,Python,Operating System,Smtplib,我有一个日常任务,它是自动化的完美候选,所以我决定将它作为一个学习Python的项目来使用。我需要做的是将一些.xlsx文件转换为.csv文件,然后通过电子邮件将每个文件发送到特定的电子邮件地址 下面是我得到的,它一直工作到接近尾声。我希望它在发送csv副本后将其删除。File1.csv会被删除,但file2.csv不会,因为它仍在另一个进程中打开 PermissionError:[WinError 32]进程无法访问该文件,因为另一个进程正在使用它:“C:\Drop\file2.csv” 所以

我有一个日常任务,它是自动化的完美候选,所以我决定将它作为一个学习Python的项目来使用。我需要做的是将一些.xlsx文件转换为.csv文件,然后通过电子邮件将每个文件发送到特定的电子邮件地址

下面是我得到的,它一直工作到接近尾声。我希望它在发送csv副本后将其删除。File1.csv会被删除,但file2.csv不会,因为它仍在另一个进程中打开

PermissionError:[WinError 32]进程无法访问该文件,因为另一个进程正在使用它:“C:\Drop\file2.csv”

所以很明显csv需要关闭,但我无法确定哪个进程打开了它,以及如何关闭它

import os
from datetime import datetime
import pandas as pd
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

files = []

drop_path = 'C:\\Data Drop\\'
path = os.chdir(drop_path)
datestamp =  datetime.now().strftime(' (%m-%d-%Y)')

#Make a CSV copy of each file
for c in os.listdir(path):
    file_name, file_ext = os.path.splitext(c)
    xlsx = pd.read_excel(file_name+file_ext)
    xlsx.to_csv(file_name+'.csv', encoding='utf-8')
    files.append(file_name+'.csv')

print('CSV copies created\n')

#Send to appropriate email addresses
recipient = ''
for s in files:

    print('Sending ',s)

    if s == 'file1.csv':
        recipient = '<email1@gmail.com>'
    elif s == 'file2.csv':
        recipient = '<email2@gmail.com>'

    email_user = 'sender@gmail.com'
    email_password = 'password'
    email_send = recipient

    msg = MIMEMultipart()
    msg['From'] = email_user
    msg['To'] = email_send
    msg['Subject'] = "Data transmittal"

    body = 'Data transmittal attached'
    msg.attach(MIMEText(body,'plain'))

    attached_file = s
    attachment  = open(attached_file,'rb')

    part = MIMEBase('application','octet-stream')
    part.set_payload((attachment).read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition',"attachment; filename= "+attached_file)

    msg.attach(part)
    text = msg.as_string()
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.starttls()
    server.login(email_user,email_password)


    server.sendmail(email_user,email_send,text)
    print(s,'sent.\n')
    server.quit()

print('All data has been sent.\n')

#Remove CSV files once sent.
for files in os.listdir(drop_path):
    if files.endswith('.csv'):
        os.remove(drop_path + files)

print('CSV files cleared.\n')

#Add the date to the end of each xlsx file name
for f in os.listdir(path):
    file_name, file_ext = os.path.splitext(f)
    if file_ext==".csv":
        continue
    else:
        new_name = file_name+datestamp+file_ext
        os.rename(f, new_name)

print('Dates added to file names.\n')

print('\nAll operations are complete.')
导入操作系统
从日期时间导入日期时间
作为pd进口熊猫
导入smtplib
从email.mime.text导入MIMEText
从email.mime.multipart导入MIMEMultipart
从email.mime.base导入MIMEBase
从电子邮件导入编码器
文件=[]
拖放路径='C:\\Data drop\'
path=os.chdir(拖放路径)
datestamp=datetime.now().strftime(“(%m-%d-%Y)”
#制作每个文件的CSV副本
对于os.listdir(路径)中的c:
文件名,文件ext=os.path.splitext(c)
xlsx=pd.read\u excel(文件名+文件外部)
xlsx.to_csv(文件名+'.csv',编码='utf-8')
files.append(文件名+'.csv')
打印('已创建CSV副本\n')
#发送到适当的电子邮件地址
收件人=“”
对于文件中的文件:
打印('发送',s)
如果s==“file1.csv”:
收件人=“”
elif s==“file2.csv”:
收件人=“”
向用户发送电子邮件sender@gmail.com'
电子邮件密码='password'
电子邮件发送=收件人
msg=MIMEMultipart()
msg['From']=电子邮件用户
msg['To']=发送电子邮件
msg['Subject']=“数据传输”
正文='附加数据传输'
msg.attach(MIMEText(正文,'plain'))
附加的_文件=s
附件=打开(附件“rb”)
part=MIMEBase('application','octet-stream')
part.set_有效载荷((附件).read())
编码器。编码_base64(部分)
part.add_头('Content-Disposition',“attachment;filename=“+attached_file”)
附加信息(部分)
text=msg.as_string()
server=smtplib.SMTP('SMTP.gmail.com',587)
server.starttls()
服务器登录(电子邮件用户、电子邮件密码)
server.sendmail(电子邮件用户、电子邮件发送、文本)
打印,“已发送”。\n”
server.quit()
打印('所有数据都已发送。\n')
#一旦发送,删除CSV文件。
对于os.listdir(拖放路径)中的文件:
如果文件.endswith('.csv'):
删除操作系统(删除路径+文件)
打印('CSV文件已清除。\n')
#将日期添加到每个xlsx文件名的末尾
对于os.listdir(路径)中的f:
文件名,文件ext=os.path.splitext(f)
如果文件_ext==“.csv”:
持续
其他:
新建名称=文件名称+日期戳+文件外部
os.重命名(f,新名称)
打印('添加到文件名的日期。\n')
打印(“\n所有操作都已完成”。)

您的错误是打开
附件,但从未关闭它

而不是:
attachment=open(附件,'rb')

使用上下文管理器:

打开(附加的_文件,'rb')作为附件:
part=MIMEBase('application','octet-stream')
part.set_有效载荷((附件).read())
#此处附件自动关闭
编码器。编码_base64(部分)
part.add_头('Content-Disposition',“attachment;filename=“+attached_file”)