В Python 3, когда я отправляю файл .csv в качестве вложения, в нем отсутствуют строки - PullRequest
0 голосов
/ 12 июля 2020

У меня есть сценарий python, который запрашивает некоторые системы, а затем добавляет результаты в файл CSV. Этот сценарий запускается раз в неделю, а затем отправляет CSV-файл по электронной почте в качестве последнего шага. Однако, когда я открываю вложение, я получаю информацию о предыдущем запуске, но не информацию о текущем запуске. Я могу go подключиться к машине, на которой запущен сценарий, и увидеть, что файл действительно содержит текущую информацию.

Вот фрагменты: Открытие файла:

out_exists = os.path.isfile('/depot/sgcap/grid_capacities.csv')
if out_exists:
        out = open("/depot/sgcap/grid_capacities.csv","a")
else:
        out = open("/depot/sgcap/grid_capacities.csv","a")
        out.write(('Date,Site,Installed Capacity (TB),Used Capacity (TB)'))

Запись и закрытие файла:

                        out.write('\n'+ str(date) + "," + str(s) + ',' + str(xisc_tb) + ',' + str(xusc_tb))


        else:
                print('\n Errored on http request with status ', response.status_code)
out.close

И, наконец, часть электронной почты (без зазрения совести):

#bundle it up and send the email
email = 'root@a.machine.com'
password = ''
send_to_email = ['some.guy@wherever.com','another.guy@wherever.com']
subject = 'StorageGRID Capacities'
message = 'This morning\'s capacity report'
file_location = ('/depot/sgcap/grid_capacities.csv')

msg = MIMEMultipart()
msg['From'] = email
msg['To'] =  ", ".join(send_to_email)
msg['Subject'] = subject

msg.attach(MIMEText(message, 'plain'))

# Setup the attachment
filename = os.path.basename(file_location)
attachment = open(file_location, "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

# Attach the attachment to the MIMEMultipart object
msg.attach(part)

server = smtplib.SMTP('my.mailserver.com', 25)
#server.starttls()
#server.login(email, password)
text = msg.as_string()
server.sendmail(email, send_to_email, text)
server.quit()

1 Ответ

3 голосов
/ 12 июля 2020

Ваши записи должны быть сброшены на диск перед отправкой файла. До этого они буферизуются и НЕ записываются в файл на диске.

Лучшая практика для очистки - просто обеспечить закрытие дескриптора файла, как отмечает Таня Байер, используя out.close() или лучшую практику , используя диспетчер контекста через open ... as.

Есть менее распространенные случаи, когда вы можете захотеть вызвать out.flush() напрямую, но это другой вариант использования для длительно выполняемых процессов, которым необходимо держать файлы открытыми на долгое время.

Краткий ответ: для обычной / небольшой записи файла просто закройте дескриптор файла для записи данных на диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...