Flask项目无法定位CSV文件路径,如何在HTML展示CSV数据?
Flask读取CSV文件路径错误问题解决
问题背景
编写Python爬虫生成了exports-imports.csv文件,想通过Flask在HTML页面展示内容,但with open始终找不到文件路径,即使移动文件位置也无效,Ctrl+右键能定位文件但程序不行,希望不使用pandas等库解决。
项目结构
├── main.py ├── scraping │ ├── exports-imports.csv ├── website │ ├── __init__.py │ ├── templates │ │ ├── datas.html │ └── datas.py
现有代码
main.py
from website import create_app app = create_app() if __name__ == '__main__': app.run(debug=True, port=9000)
init.py
from flask import Flask def create_app(): app = Flask(__name__) app.debug = True from .datas import datas app.register_blueprint(datas, url_prefix='/') return app
datas.html
<table> <tr> <thead> <th>Year</th> <th>Exports</th> <th>Imports</th> </thead> </tr> {% for row in data %} <tr> <td>{{ row[0] }}</td> <td>{{ row[1] }}</td> <td>{{ row[2] }}</td> </tr> {% endfor %} </table>
exports-imports.csv
1964;33193;30084 1965;36635;36019 1966;41224;37156 1967;44505;35884 1968;50900;41506 1969;58061;50092
datas.py
from flask import Blueprint, render_template import csv datas = Blueprint('datas', __name__) @datas.route('/datas') def show_data(): try: data = [] with open('../scraping/exports-imports.csv', 'r') as f: reader = csv.reader(f) for row in reader: data.append(row) return render_template('datas.html', data=data) except FileNotFoundError: return "Error: file not found"
解决方案
问题核心是相对路径的基准目录错误:Flask运行时的工作目录是启动main.py的项目根目录,而非datas.py所在的website目录,直接用../scraping/...会导致路径计算偏差。此外你的CSV用分号分隔,默认csv.reader用逗号解析,会导致数据读取异常。
修改datas.py,通过文件路径构建绝对路径,并指定分隔符:
from flask import Blueprint, render_template import csv import os datas = Blueprint('datas', __name__) @datas.route('/datas') def show_data(): try: data = [] # 获取当前文件的绝对目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 向上回溯到项目根目录 root_dir = os.path.dirname(current_dir) # 拼接CSV文件的绝对路径 csv_path = os.path.join(root_dir, 'scraping', 'exports-imports.csv') # 指定分号作为分隔符读取CSV with open(csv_path, 'r') as f: reader = csv.reader(f, delimiter=';') for row in reader: data.append(row) return render_template('datas.html', data=data) except FileNotFoundError: return f"Error: file not found at {csv_path}"
验证方法
启动main.py后访问http://localhost:9000/datas,即可看到正确渲染的表格数据。若仍报错,返回的错误信息会显示实际查找路径,可据此核对文件位置。
内容的提问来源于stack exchange,提问作者Rajan Rokaya
相关产品推荐
相关产品推荐

