[英]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.