Я пытаюсь изменить существующий сценарий python, чтобы преобразовать CSV в памяти в (также в памяти) zip-архив и отправить его в виде вложения в электронное письмо. Я успешно подключил файл CSV в памяти (через объект MIMEText), но у меня возникли проблемы с файлом ZIP (через объект MIMEBase) из-за требований к настройке полезной нагрузки байтов файла.
Вот код, который у меня есть:
csv_buffer = cStringIO.StringIO()
buffer = cStringIO.StringIO()
zf = zipfile.ZipFile(buffer,
mode='w',
compression=zipfile.ZIP_DEFLATED,
)
zf.writestr(csvfile + ".csv", csv_buffer.getvalue())
csv_file = MIMEBase('application', 'zip')
csv_file.set_payload(zf.read())
encoders.encode_base64(csv_file)
csv_file.add_header('Content-Disposition', 'attachment',
filename=csvfile + ".zip")
msg.attach(csv_file)
Из этого Ответа этого пользователя с наибольшим количеством голосов Я могу исправить полученную ошибку read() takes at least 2 arguments
, выполнив обычную open()
операция над zip-файлом, но поскольку этот файл является буферным потоком, который не работает.
Я не уверен, как еще можно загрузить объект zipfile
в set_payload
, но это также должно работать. подумал бы.