2

I'm needing to input data from a CSV file and create a HTML table as the output.

I am currently working with:

with open('2016motogp.csv') as csvfile:
 reader = csv.DictReader(csvfile, delimiter='\t')
 for row in reader:
     print('<tr>')
     for fn in reader.fieldnames:
         print('<td>{}</td>'.format(row[fn]))
     print('</tr>')

The CSV file I want to read into the table is: https://ufile.io/6joj6

When I run the function I get the error:

    ---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-11-3a27549e50fe> in <module>()
----> 1 write_html_table("2016motogp")

<ipython-input-9-91d2a78b30ad> in write_html_table(filename)
     55     with open(filename + ".csv") as csvfile:
     56         reader = csv.DictReader(csvfile, delimiter='\t')
---> 57         for row in reader:
     58             print('<tr>')
     59             for fn in reader.fieldnames:

E:\Anaconda\lib\csv.py in __next__(self)
    109         if self.line_num == 0:
    110             # Used only for its side effect.
--> 111             self.fieldnames
    112         row = next(self.reader)
    113         self.line_num = self.reader.line_num

E:\Anaconda\lib\csv.py in fieldnames(self)
     96         if self._fieldnames is None:
     97             try:
---> 98                 self._fieldnames = next(self.reader)
     99             except StopIteration:
    100                 pass

E:\Anaconda\lib\encodings\cp1252.py in decode(self, input, final)
     21 class IncrementalDecoder(codecs.IncrementalDecoder):
     22     def decode(self, input, final=False):
---> 23         return codecs.charmap_decode(input,self.errors,decoding_table)[0]
     24 
     25 class StreamWriter(Codec,codecs.StreamWriter):

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 1037: character maps to <undefined>

If anybody provide some guidance or help out it would be much appreciated.

Thanks in advance,

2 Answers 2

6

Use Python pandas DataFrame to_html method

You could read the csv file into a Python pandas DataFrame. Then, use the DataFrame to_html feature to either create an HTML file or assign the result into a string and use it that way. This converts the DataFrame into an HTML table. See links to Python docs below.

import pandas as pd

# Read the csv file in
df = pd.read_csv('2016motogp.csv')

# Save to file
df.to_html('myTable.htm')

# Assign to string
htmTable = df.to_html()

pandas read_csv doc

pandas to_html doc

Sign up to request clarification or add additional context in comments.

Comments

3

The error might be because the file in question might not be using CP1252 encoding. Assuming it's using utf-8 encoding just add the encoding in open statement and it'll work. I have tested it.

import csv

table = ''
with open(csv_path, encoding="utf8") as csvFile:
    reader = csv.DictReader(csvFile, delimiter=',')
    table = '<tr>{}</tr>'.format(''.join(['<td>{}</td>'.format(header) for header in reader.fieldnames]))
    for row in reader:
        table_row = '<tr>'
        for fn in reader.fieldnames:
            table_row += '<td>{}</td>'.format(row[fn])
        table_row += '</tr>'
        table += table_row

9 Comments

Certainly seems to have done something, this is the output now. imgur.com/0qGtzX2
You have to change your delimter as well.
Please check now.
Is there a reason it is not reading the top row with headers? It is beginning to look nicer now. imgur.com/OUW7o02
Thanks, I am still unsure of the unnecessary <tr></td> throughout and the \ufeff in the Year cell as well as the \xa0 before each riders name, how could this be addressed within the code? Here is the output w3schools.com/code/tryit.asp?filename=FG5JLWTH57MF
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.