2016-09-27 3 views
0

Работа с текстовым файлом для поиска строки, а затем отправить по электронной почте несколько строк.Поиск текстовых файлов и результатов электронной почты

У меня есть поиск работу и выводит правильные строки электронной посылаемые успешно, однако он содержит только последнюю строку вывода

Любые мысли?

File.txt

first 
second 
thrid 
------------------------------------------------------------------------------ 
after first 
after second 
after thrid 
after forth 
after fifth 
after sixth 

мой код

import smtplib 

from email.mime.text import MIMEText 

from_address = "[email protected]" 
to_address = "[email protected]" 


with open("file.txt", "r") as f: 
    searchlines = f.readlines() 
    for i, line in enumerate(searchlines): 
     if "------------------------------------------------------------------------------" in line: 
      for l in searchlines[i:i+6]: print l, 
      output = l 

      msg = MIMEText(output) 
      msg['Subject'] = "Test email" 
      msg['From'] = from_address 
      msg['To'] = to_address 

      body = output 

      # Send the message via local SMTP server. 
      s = smtplib.SMTP('smtp.domain.com', '8025') 

      s.sendmail(from_address, to_address, msg.as_string()) 

      s.quit() 

Выход через печать:

------------------------------------------------------------------------------ 
after first 
after second 
after thrid 
after forth 
after fifth 

электронной почты содержит только в теле

after fifth 

ответ

-1

ваш цикл печатает все строки, но затем цикл завершается, и л устанавливается на последний элемент в цикле: после пятого

тогда вы по электронной почте, что в прошлом L

0

Ваш отступы шаткий. Цикл должен собирать строки, тогда вы должны отправить электронное письмо, когда вы их собрали.

with open("file.txt", "r") as f: 
    searchlines = f.readlines() 
# <-- unindent; we don't need this in the "with" 
for i, line in enumerate(searchlines): 
    # Aesthetics: use "-" * 78 
    if "-" * 78 in line: 
     for l in searchlines[i:i+6]: 
      print l, 
     # collect all the lines in output, not just the last one 
     output = ''.join(searchlines[i:i+6]) 
     # if you expect more than one result, this is wrong 
     break 

# <-- unindent: we are done when the for loop is done 
# Add an explicit encoding -- guessing here which one to use 
msg = MIMEText(output, 'plain', 'utf-8') 
msg['Subject'] = "Test email" 
msg['From'] = from_address 
msg['To'] = to_address 

# no point in assigning body and not using it for anything 

# Send the message via local SMTP server. 
s = smtplib.SMTP('smtp.domain.com', '8025') 
s.sendmail(from_address, to_address, msg.as_string()) 
s.quit() 

Реальная ошибка в том, что output = l будет собирать только последнее значение l после внутреннего for l цикла, но перестройка программы не делать что-то в цикле, когда они должны только случиться один раз (и наоборот!) надеюсь, делает его более ясным.

Если результата может быть несколько, просто удалить break не хватит - это восстановит исходную ошибку в другой форме, где будет отправлено только последнее совпадение из шести строк. Если вам нужно поддерживать несколько результатов, ваш код должен каким-то образом объединить их в одно сообщение.

+0

ah ok я вижу, поэтому собираю вывод в результате. orig.encode ('ascii') AttributeError: объект 'list' не имеет атрибута 'encode' – Adam

+0

Я пропустил место, где вы создали часть тела MIMEText - обновил ответ. – tripleee

+0

отлично, спасибо – Adam

Смежные вопросы