简体   繁体   English

在 Python 中将 CSV 转换为 HTML 表格

[英]Converting CSV to HTML Table in Python

I'm trying to take data from a .csv file and importing into a HTML table within python.我正在尝试从 .csv 文件中获取数据并导入到 python 中的 HTML 表中。

This is the csv file https://www.mediafire.com/?mootyaa33bmijiq这是 csv 文件https://www.mediafire.com/?mootyaa33bmijiq

Context:背景:
The csv is populated with data from a football team [Age group, Round, Opposition, Team Score, Opposition Score, Location]. csv 填充了来自足球队的数据 [年龄组、回合、反对派、球队得分、反对派得分、位置]。 I need to be able to select a specific age group and only display those details in separate tables.我需要能够选择一个特定的年龄组,并且只在单独的表格中显示这些详细信息。

This is all I've got so far....这就是我到目前为止所拥有的......

infile = open("Crushers.csv","r")

for line in infile:
    row = line.split(",")
    age = row[0]
    week = row [1]
    opp = row[2]
    ACscr = row[3]
    OPPscr = row[4]
    location = row[5]

if age == 'U12':
   print(week, opp, ACscr, OPPscr, location)

First install pandas:首先安装熊猫:

pip install pandas

Then run:然后运行:

import pandas as pd

columns = ['age', 'week', 'opp', 'ACscr', 'OPPscr', 'location']
df = pd.read_csv('Crushers.csv', names=columns)

# This you can change it to whatever you want to get
age_15 = df[df['age'] == 'U15']
# Other examples:
bye = df[df['opp'] == 'Bye']
crushed_team = df[df['ACscr'] == '0']
crushed_visitor = df[df['OPPscr'] == '0']
# Play with this

# Use the .to_html() to get your table in html
print(crushed_visitor.to_html())

You'll get something like:你会得到类似的东西:

 <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>age</th> <th>week</th> <th>opp</th> <th>ACscr</th> <th>OPPscr</th> <th>location</th> </tr> </thead> <tbody> <tr> <th>34</th> <td>U17</td> <td>1</td> <td>Banyo</td> <td>52</td> <td>0</td> <td>Home</td> </tr> <tr> <th>40</th> <td>U17</td> <td>7</td> <td>Aspley</td> <td>62</td> <td>0</td> <td>Home</td> </tr> <tr> <th>91</th> <td>U12</td> <td>7</td> <td>Rochedale</td> <td>8</td> <td>0</td> <td>Home</td> </tr> </tbody> </table>

Firstly, install pandas:首先,安装熊猫:

pip install pandas

Then,然后,

import pandas as pd         
a = pd.read_csv("Crushers.csv") 
# to save as html file 
# named as "Table" 
a.to_html("Table.htm") 
# assign it to a  
# variable (string) 
html_file = a.to_html()

Before you begin printing the desired rows, output some HTML to set up an appropriate table structure.在开始打印所需的行之前,输出一些 HTML 以设置适当的表结构。

When you find a row you want to print, output it in HTML table row format.当您找到要打印的行时,以 HTML 表格行格式输出。

# begin the table
print("<table>")

# column headers
print("<th>")
print("<td>Week</td>")
print("<td>Opp</td>")
print("<td>ACscr</td>")
print("<td>OPPscr</td>")
print("<td>Location</td>")
print("</th>")

infile = open("Crushers.csv","r")

for line in infile:
    row = line.split(",")
    age = row[0]
    week = row [1]
    opp = row[2]
    ACscr = row[3]
    OPPscr = row[4]
    location = row[5]

    if age == 'U12':
        print("<tr>")
        print("<td>%s</td>" % week)
        print("<td>%s</td>" % opp)
        print("<td>%s</td>" % ACscr)
        print("<td>%s</td>" % OPPscr)
        print("<td>%s</td>" % location)
        print("</tr>")

# end the table
print("</table>")

First some imports:首先是一些进口:

import csv
from html import escape
import io

Now the building blocks - let's make one function for reading the CSV and another function for making the HTML table:现在构建块 - 让我们创建一个用于读取 CSV 的函数和另一个用于制作 HTML 表格的函数:

def read_csv(path, column_names):
    with open(path, newline='') as f:
        # why newline='': see footnote at the end of https://docs.python.org/3/library/csv.html
        reader = csv.reader(f)
        for row in reader:
            record = {name: value for name, value in zip(column_names, row)}
            yield record

def html_table(records):
    # records is expected to be a list of dicts
    column_names = []
    # first detect all posible keys (field names) that are present in records
    for record in records:
        for name in record.keys():
            if name not in column_names:
                column_names.append(name)
    # create the HTML line by line
    lines = []
    lines.append('<table>\n')
    lines.append('  <tr>\n')
    for name in column_names:
        lines.append('    <th>{}</th>\n'.format(escape(name)))
    lines.append('  </tr>\n')
    for record in records:
        lines.append('  <tr>\n')
        for name in column_names:
            value = record.get(name, '')
            lines.append('    <td>{}</td>\n'.format(escape(value)))
        lines.append('  </tr>\n')
    lines.append('</table>')
    # join the lines to a single string and return it
    return ''.join(lines)

Now just put it together :)现在把它放在一起:)

records = list(read_csv('Crushers.csv', 'age week opp ACscr OPPscr location'.split()))

# Print first record to see whether we are loading correctly
print(records[0])
# Output:
# {'age': 'U13', 'week': '1', 'opp': 'Waterford', 'ACscr': '22', 'OPPscr': '36', 'location': 'Home'}

records = [r for r in records if r['age'] == 'U12']

print(html_table(records))
# Output:
# <table>
#   <tr>
#     <th>age</th>
#     <th>week</th>
#     <th>opp</th>
#     <th>ACscr</th>
#     <th>OPPscr</th>
#     <th>location</th>
#   </tr>
#   <tr>
#     <td>U12</td>
#     <td>1</td>
#     <td>Waterford</td>
#     <td>0</td>
#     <td>4</td>
#     <td>Home</td>
#   </tr>
#   <tr>
#     <td>U12</td>
#     <td>2</td>
#     <td>North Lakes</td>
#     <td>12</td>
#     <td>18</td>
#     <td>Away</td>
#   </tr>
#   ...
# </table>

A few notes:一些注意事项:

  • csv.reader works better than line splitting because it also handles quoted values and even quoted values with newlines csv.reader比行拆分效果更好,因为它还处理引用值,甚至用换行符处理引用值

  • html.escape is used to escape strings that could potentially contain character < or > html.escape用于转义可能包含字符<>字符串

  • it is often times easier to worh with dicts than tuples使用 dicts 通常比使用元组更容易

  • usually the CSV files contain header (first line with column names) and could be easily loaded usingcsv.DictReader ;通常 CSV 文件包含标题(带有列名的第一行)并且可以使用csv.DictReader轻松加载; but the Crushers.csv has no header (the data start from very first line) so we build the dicts ourselves in the function read_csv但是Crushers.csv没有标题(数据从第一行开始)所以我们自己在函数read_csv构建字典

  • both functions read_csv and html_table are generalised so they can work with any data, the column names are not "hardcoded" into them read_csvhtml_table两个函数都是通用的,因此它们可以处理任何数据,列名没有“硬编码”到它们中

  • yes, you could use pandas read_csv and to_html instead :) But it is good to know how to do it without pandas in case you need some customization.是的,你可以使用熊猫read_csvto_html代替:)不过这是好事,知道如何做没有的情况下,你需要一些定制大熊猫。 Or just as a programming exercise.或者只是作为一个编程练习。

This should be working as well:这也应该有效:

from html import HTML
import csv

def to_html(csvfile):
    H = HTML()
    t=H.table(border='2')
    r = t.tr
    with open(csvfile) as csvfile:
        reader = csv.DictReader(csvfile)
        for column in reader.fieldnames:
            r.td(column)
        for row in reader:
            t.tr
            for col in row.iteritems():
                t.td(col[1])
    return t

and call the function by passing the csv file to it.并通过将 csv 文件传递​​给它来调用该函数。

Below function takes filename, headers(optional) and delimiter(optional) as input and converts csv to html table and returns as string.下面的函数将文件名、标题(可选)和分隔符(可选)作为输入,并将 csv 转换为 html 表并作为字符串返回。 If headers are not provided, assumes header is already present in csv file.如果未提供标头,则假定标头已存在于 csv 文件中。

Converts csv file contents to HTML formatted table将 csv 文件内容转换为 HTML 格式的表格

def csv_to_html_table(fname,headers=None,delimiter=","):
    with open(fname) as f:
        content = f.readlines()
    #reading file content into list
    rows = [x.strip() for x in content]
    table = "<table>"
    #creating HTML header row if header is provided 
    if headers is not None:
        table+= "".join(["<th>"+cell+"</th>" for cell in headers.split(delimiter)])
    else:
        table+= "".join(["<th>"+cell+"</th>" for cell in rows[0].split(delimiter)])
        rows=rows[1:]
    #Converting csv to html row by row
    for row in rows:
        table+= "<tr>" + "".join(["<td>"+cell+"</td>" for cell in row.split(delimiter)]) + "</tr>" + "\n"
    table+="</table><br>"
    return table

In your case, function call will look like this, but this will not filter out entries in csv but directly convert whole csv file to HTML table.在您的情况下,函数调用将如下所示,但这不会过滤掉 csv 中的条目,而是直接将整个 csv 文件转换为 HTML 表。

filename="Crushers.csv"
myheader='age,week,opp,ACscr,OPPscr,location'
html_table=csv_to_html_table(filename,myheader)

Note: To filter out entries with certain values add conditional statement in for loop.注意:要过滤掉具有特定值的条目,请在 for 循环中添加条件语句。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM