web-dev-qa-db-ja.com

PythonでCSVをHTMLテーブルに変換する

.csvファイルからデータを取得し、Python内のHTMLテーブルにインポートしようとしています。

これはcsvファイルです https://www.mediafire.com/?mootyaa33bmijiq

環境:
csvには、フットボールチーム[年齢グループ、ラウンド、対戦、チームスコア、対戦スコア、場所]からのデータが入力されています。特定の年齢グループを選択し、それらの詳細のみを別のテーブルに表示できるようにする必要があります。

これで私はこれですべてです。

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)
5
kmarshy

目的の行の印刷を開始する前に、HTMLを出力して適切なテーブル構造を設定します。

印刷する行が見つかったら、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>")
1
John Gordon

最初にパンダをインストールします:

pip install pandas

次に実行します:

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())

次のようなものが得られます:

<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>
12
Nabil Bennani

これも同様に機能するはずです:

from html import HTML
import csv

def to_html(csvfile):
    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

そして、csvファイルを渡して関数を呼び出します。

1
Davor Banovic

以下の関数は、入力としてファイル名、ヘッダー(オプション)、および区切り文字(オプション)を取り、csvをhtmlテーブルに変換し、文字列として返します。ヘッダーが提供されていない場合、ヘッダーが既にcsvファイルに存在していると見なされます。

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

あなたの場合、関数呼び出しは次のようになりますが、これはフィルタリングしません csvのエントリを出力しますが、csvファイル全体をHTMLテーブルに直接変換します。

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

注:特定の値を持つエントリを除外するには、forループに条件ステートメントを追加します。

0
Yash

最初にいくつかのインポート:

import csv
from html import escape
import io

ここでビルディングブロック-CSVを読み取るための1つの関数と、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)

ちょうどそれを一緒に入れてください:)

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>

いくつかのメモ:

  • csv.reader は、引用符で囲まれた値や引用符で囲まれた値をも改行で処理するため、行分割よりも適切に動作します

  • html.escape は、文字<または>を含む可能性のある文字列をエスケープするために使用されます

  • 多くの場合、タプルよりもディクテーションを使用する方が簡単です

  • 通常、CSVファイルにはヘッダー(列名を含む最初の行)が含まれ、 csv.DictReader ;を使用して簡単にロードできます。ただし、Crushers.csvにはヘッダーがありません(データは最初の行から始まります)ので、関数read_csvで辞書を作成します

  • read_csvhtml_tableの両方の関数は一般化されているため、任意のデータを処理できます。列名は「ハードコード」されていません

  • はい、代わりにpandas read_csv および to_html を使用できます:)カスタマイズが必要な場合にpandasなしでそれを行う。またはプログラミング演習として。

0
Messa