5 Best Ways to Convert CSV to HTML Table with Python

πŸ’‘ Problem Formulation: Often, there’s a need to convert data from a CSV file into a HTML table for better readability and web presentation. For instance, you may have a CSV file containing data like “Name, Age, City” and you want to display this information on a webpage as a neatly formatted table. This article provides five methods to accomplish this task using Python.

Method 1: Using pandas

Pandas is a powerful data manipulation library in Python that can convert a CSV file to an HTML table effortlessly. The function pandas.read_csv() reads the CSV into a DataFrame, and then DataFrame.to_html() converts it into an HTML table.

Here’s an example:

import pandas as pd

# Read the CSV file
data = pd.read_csv('data.csv')

# Convert the DataFrame to an HTML table
html_table = data.to_html()

print(html_table)

Output:

<table border="1" class="dataframe">
  ...
</table>

This snippet first reads a CSV file using pandas into a DataFrame object. It then converts the DataFrame to an HTML string with the to_html() method. The resulting html_table variable contains the HTML code for the table that can be embedded into a webpage.

Method 2: Using csv and Beautiful Soup

Beautiful Soup is a library designed to parse and manipulate HTML and XML files. It can be combined with Python’s built-in csv module to read CSV data and build an HTML table.

Here’s an example:

import csv
from bs4 import BeautifulSoup

# Read the CSV data
with open('data.csv', 'r') as file:
    reader = csv.reader(file)
    headers = next(reader)
    data = [row for row in reader]

# Build the HTML table
soup = BeautifulSoup('<table></table>', 'html.parser')
table = soup.find('table')

# Add the headers
table.append(soup.new_tag('tr', **{'id': 'headers'}))
for header in headers:
    th = soup.new_tag('th')
    th.string = header
    table.tr.append(th)

# Add the CSV data rows
for row in data:
    tr = soup.new_tag('tr')
    for cell in row:
        td = soup.new_tag('td')
        td.string = cell
        tr.append(td)
    table.append(tr)

html_table = str(table)
print(html_table)

Output:

<table>
  <tr id="headers"><th>Name</th><th>Age</th><th>City</th></tr>
  <tr><td>John</td><td>30</td><td>New York</td></tr>
  ...
</table>

This code starts by reading the CSV file and storing the data. Using Beautiful Soup, it constructs an HTML table, iteratively adds header and data rows, and converts it to a string that represents the HTML markup of the table.

Method 3: Using csv module and string formatting

The csv module can read CSV data, and string formatting can be utilized to create an HTML table from scratch without third-party packages.

Here’s an example:

import csv

# Open the CSV file and read the data
with open('data.csv', 'r') as file:
    csv_data = csv.reader(file)
    headers = next(csv_data)

    # Start with the table header
    html_table = '<table>\n<tr>'
    for header in headers:
        html_table += f'<th>{header}</th>'
    html_table += '</tr>\n'

    # Add the table rows
    for row in csv_data:
        html_table += '<tr>'
        for cell in row:
            html_table += f'<td>{cell}</td>'
        html_table += '</tr>\n'
    html_table += '</table>'

print(html_table)

Output:

<table>
<tr><th>Name</th><th>Age</th><th>City</th></tr>
<tr><td>John</td><td>30</td><td>New York</td></tr>
...
</table>

The above code reads the CSV and gradually constructs an HTML table with headers and data rows using string concatenation and Python’s f-strings.

Method 4: Using Pandas and Jinja2 templating

Pandas can be paired with Jinja2, a templating language for Python, to create an HTML table. This allows for a more flexible and customizable table design.

Here’s an example:

import pandas as pd
from jinja2 import Template

# Read data from CSV
data = pd.read_csv('data.csv')

# Define a Jinja2 template for the HTML table
template = Template("""
<table>
  {% for column in data.columns %}
  <th>{{ column }}</th>
  {% endfor %}
  {% for row in data.itertuples() %}
  <tr>
    {% for item in row[1:] %}
    <td>{{ item }}</td>
    {% endfor %}
  </tr>
  {% endfor %}
</table>
""")

# Render the HTML
html_table = template.render(data=data)
print(html_table)

Output:

<table>
  <th>Name</th>
  <th>Age</th>
  <th>City</th>
  <tr>
    <td>John</td>
    <td>30</td>
    <td>New York</td>
  </tr>
  ...
</table>

Using a templating engine like Jinja2, you can define an HTML table template with placeholders for data. The render method then interpolates the DataFrame data within this template, resulting in a clean and customizable HTML table.

Bonus One-Liner Method 5: Using pandas’ one-liner

Pandas provides a one-liner to convert a CSV directly to an HTML table, which is ideal for quick conversions without the need for customization.

Here’s an example:

print(pd.read_csv('data.csv').to_html())

Output:

<table border="1" class="dataframe">
  ...
</table>

In a single line of code, pandas reads the CSV file and converts the resulting DataFrame into an HTML table string, suitable for embedding directly into a webpage.

Summary/Discussion

Method 1: pandas built-in functions. Strengths: Very concise and requires minimal coding. Weaknesses: Needs an additional library (pandas), not suitable for massive datasets due to memory usage.
Method 2: Beautiful Soup and csv. Strengths: Parses and constructs HTML with more control over elements and classes. Weaknesses: Slightly more complex, requires third-party library (Beautiful Soup).
Method 3: csv module with string formatting. Strengths: Does not depend on external libraries, relatively simple. Weaknesses: Less flexibility in formatting and design.
Method 4: Pandas and Jinja2 templating. Strengths: Highly customizable and can produce more intricate table designs. Weaknesses: Requires understanding of Jinja2 syntax, involves two external libraries.
Bonus Method 5: pandas one-liner. Strengths: Extremely easy to use for quick tasks. Weaknesses: No control over the table formatting, must have pandas installed.