簡體   English   中英

如何使用 flask 高效地將大型 csv 文件加載到 html 表中?

[英]How to efficiently load large csv file into html table using flask?

我想知道使用 flask(我是 flask 初學者)將 csv 數據(超過 60,000 行)加載到 html 表中的最佳做法是什么。

我能夠將數據加載到 html 表,但頁面在我的瀏覽器中加載需要很長時間。 有人能為我的場景推薦更好、更強大的解決方案嗎? 先感謝您!

到目前為止我的代碼:

app.py

@app.route('/')
def weather_dashboard():
    filename = '/path/to/my/data.csv'
    data = pandas.read_csv(filename, header=0)
    myData = list(data.values)
    return render_template('home.html', myData=myData)

home.html

<table class="table table-striped table-sm">
  <thead>
    <tr>
      <th>date</th>
      <th>ID</th>
      <th>Items</th>
      <th>Sold Items</th>
    </tr>
  </thead>
  <tbody>
    {% for value in myData%}
    <tr>
      <td>{{ value[0] }}</td>
      <td>{{ value[1] }}</td>
      <td>{{ value[2] }}</td>
      <td>{{ value[3] }}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>

提前致謝!

這是一種以資源使用 (RAM) 為代價提高性能的方法。 它只會在文件內容 hash 更改時更新。

import csv
import hashlib
from pathlib import Path

import flask


class Cache:
    template = '''<tbody>
{% for v in data %}
  <tr>
    <td>{{ v[0] }}</td>
    <td>{{ v[1] }}</td>
    <td>{{ v[2] }}</td>
    <td>{{ v[3] }}</td>
  </tr>
{% endfor %}
</tbody>'''
    csv_file = Path(__file__).parent / 'data.csv'

    def __init__(self, app: flask.Flask):
        self._app = app
        self._cache = None
        self._filehash = None
        self()  # first-time initialization

    def __call__(self):
        filehash = self._hash_file()
        if filehash != self._filehash:
            self._filehash = filehash
            self._cache = self._render()

        return self._cache

    def _hash_file(self) -> str:
        with self.csv_file.open('rb') as f:
            md5 = hashlib.md5()
            while data := f.read(65536):  # 64kb chunks
                md5.update(data)
            return md5.hexdigest()

    def _render(self):
        with self.csv_file.open(newline='') as f:
            reader = csv.reader(f)
            next(reader)  # skip header

            with self._app.app_context():
                return flask.render_template_string(self.template, data=reader)


app = flask.Flask(__name__)
cache = Cache(app)


@app.route('/')
def weather_dashboard():
    return flask.render_template('home.html', table_body=cache())

像這段代碼一樣更改您的 app.py。

@app.route('/')
def weather_dashboard():
    filename = '/path/to/my/data.csv'
    data = pandas.read_csv(filename, header=0)
    myData = data.values
    return render_template('home.html', myData=myData)

嘗試使用 pandas.to_html:

@app.route('/')
def weather_dashboard():
    filename = '/path/to/my/data.csv'
    data = pandas.read_csv(filename, header=0)
    data.columns=['date','ID','Items','Sold Items']
    data.to_html(open('data.html', 'w'))
    return render_template('data.html')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM