无法关闭 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()



手掌心
浏览 155回答 1
1回答

红糖糍粑

您的错误是打开attachment但从未关闭它。代替 :attachment  = open(attached_file,'rb')使用with open()上下文管理器:with open(attached_file,'rb') as attachment:    part = MIMEBase('application','octet-stream')    part.set_payload((attachment).read())# here attachment is closed automaticallyencoders.encode_base64(part)part.add_header('Content-Disposition',"attachment; filename= "+attached_file)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python