Search code examples
pythonhtmllistsmtpsublist

How to use *args to create multiple html tables from lists?


I'd like to create a function that can take in an arbitrary number of lists that would be turned into HTML tables that would be separated by breaks for the purposes of sending an email with multiple tables.

Inputs:

 lsta = [['a','b','c'],['1','2','3'],['d','e','f']]
 lstb = [['a','b','c'],['1','2','3'],['d','e','f']]
 lstc = [['a','b','c'],['1','2','3'],['d','e','f']]

Desired Output

 <TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">
 <TR>
<TD>a</TD>
<TD>b</TD>
<TD>c</TD>
</TR>
<TR>
<TD>1</TD>
<TD>2</TD>


 <TD>3</TD>
 </TR>
 <TR>
  <TD>d</TD>
  <TD>e</TD>
  <TD>f</TD>
 </TR>
</TABLE>

</br>

<TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">
 <TR>
  <TD>a</TD>
  <TD>b</TD>
  <TD>c</TD>
 </TR>
 <TR>
  <TD>1</TD>
  <TD>2</TD>
  <TD>3</TD>
 </TR>
 <TR>
  <TD>d</TD>
  <TD>e</TD>
  <TD>f</TD>
 </TR>
</TABLE>

</br>

<TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">
 <TR>
  <TD>a</TD>
  <TD>b</TD>
  <TD>c</TD>
 </TR>
 <TR>
  <TD>1</TD>
  <TD>2</TD>
  <TD>3</TD>
 </TR>
 <TR>
  <TD>d</TD>
  <TD>e</TD>
  <TD>f</TD>
 </TR>
</TABLE>

my attempt:

 import HTML
def HtmlTablesfromLists(*args):
 [HTML.table(arg) + "</br> for arg in args]

Result:

['<TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">\n <TR>\n  <TD>a</TD>\n  <TD>b</TD>\n  <TD>c</TD>\n </TR>\n <TR>\n  <TD>1</TD>\n  <TD>2</TD>\n  <TD>3</TD>\n </TR>\n <TR>\n  <TD>d</TD>\n  <TD>e</TD>\n  <TD>f</TD>\n </TR>\n</TABLE></br>', '<TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">\n <TR>\n  <TD>a</TD>\n  <TD>b</TD>\n  <TD>c</TD>\n </TR>\n <TR>\n  <TD>1</TD>\n  <TD>2</TD>\n  <TD>3</TD>\n </TR>\n <TR>\n  <TD>d</TD>\n  <TD>e</TD>\n  <TD>f</TD>\n </TR>\n</TABLE></br>', '<TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">\n <TR>\n  <TD>a</TD>\n  <TD>b</TD>\n  <TD>c</TD>\n </TR>\n <TR>\n  <TD>1</TD>\n  <TD>2</TD>\n  <TD>3</TD>\n </TR>\n <TR>\n  <TD>d</TD>\n  <TD>e</TD>\n  <TD>f</TD>\n </TR>\n</TABLE></br>']

Bonus Question:

How would I ensure that this is passed into the following function correctly

def GmailSend(self,email_subject,body_of_email):

    session = smtplib.SMTP('smtp.gmail.com', 587)
    session.ehlo()
    session.starttls()
    session.login(GMAIL_USERNAME, GMAIL_PASSWORD)
    headers = "\r\n".join(["from: " + GMAIL_USERNAME,
        "subject: " + email_subject,
        "to: " + recipient,
        "mime-version: 1.0",
        "content-type: text/html"])
    content = headers + "\r\n\r\n" + body_of_email
    session.sendmail(GMAIL_USERNAME, recipient, content)

Solution

  • You're almost there, join the elements of your current resulting list with '' makes your desired output string:

    In [16]: lst = ['<TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">\n <TR>\n  <TD>a</TD>\n  <TD>b</TD>\n  <TD>c</TD>\n </TR>\n <TR>\n  <TD>1</TD>\n  <TD>2</TD>\n  <TD>3</TD>\n </TR>\n <TR>\n  <TD>d</TD>\n  <TD>e</TD>\n  <TD>f</TD>\n </TR>\n</TABLE></br>', '<TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">\n <TR>\n  <TD>a</TD>\n  <TD>b</TD>\n  <TD>c</TD>\n </TR>\n <TR>\n  <TD>1</TD>\n  <TD>2</TD>\n  <TD>3</TD>\n </TR>\n <TR>\n  <TD>d</TD>\n  <TD>e</TD>\n  <TD>f</TD>\n </TR>\n</TABLE></br>', '<TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">\n <TR>\n  <TD>a</TD>\n  <TD>b</TD>\n  <TD>c</TD>\n </TR>\n <TR>\n  <TD>1</TD>\n  <TD>2</TD>\n  <TD>3</TD>\n </TR>\n <TR>\n  <TD>d</TD>\n  <TD>e</TD>\n  <TD>f</TD>\n </TR>\n</TABLE></br>']
    
    In [17]: print ''.join(lst)
    <TABLE cellpadding="4" style="border: 1px solid #000000; border-collapse: collapse;" border="1">
     <TR>
      <TD>a</TD>
      <TD>b</TD>
      <TD>c</TD>
     </TR>
     <TR>
      <TD>1</TD>
      <TD>2</TD>
      <TD>3</TD>
     </TR>
     ....
    </TABLE></br>