如果对象是具有 null 值的数据帧和具有用下划线分隔的数字的列,如何在 Flask 应用中的应用路由之间传递对象?



我正在开发一个网络应用程序,用户将上传一个.csv文件,该文件将在下一页上呈现为html。然后,需要在下一页上使用相同的.csv文件(或导入到的 pandas 数据帧)。所以我需要在@app.routes 之间移动这个对象。我的理解是,session是在Flask中执行此操作的正确方法。但是,会话要求序列化对象。

这很好,除了在将 json 转换回熊猫时,下划线会被删除。显然,这是因为它被视为一个数字对象,_扮演逗号的角色,开发人员表示他们不打算为此提供修复程序。

我制作了一个简单的应用程序来演示这个问题:

controller.py

#!/usr/bin/env python3
import pandas as pd
from flask import Flask, render_template, session
import os

app = Flask(__name__)

app.secret_key = os.urandom(28)

@app.route('/first_page', methods=['GET', 'POST'])
def first_page():
d = {'products': ['pencils', 'pens', 'erasers'], 'id_code': ['1_2', '10_7', '12_11']}
df = pd.DataFrame(d)
print(df)
session["data"] = df.to_json()
return render_template('/private/test_page1.html')
@app.route('/second_page', methods=['GET', 'POST'])
def second_page():
dat = session.get('data')
dat = pd.read_json(dat)
print(dat)
return render_template('/private/test_page2.html')


if __name__ == '__main__':
app.run(port=5001,debug=True)

控制台中的输出,您可以从中看到下划线已被删除。

products id_code
0  pencils     1_2
1     pens    10_7
2  erasers   12_11
127.0.0.1 - - [01/Apr/2019 22:49:27] "GET /first_page HTTP/1.1" 200 -
products  id_code
0  pencils       12
1     pens      107
2  erasers     1211
127.0.0.1 - - [01/Apr/2019 22:49:28] "POST /second_page HTTP/1.1" 200 -

那么,有没有比简单地"在导入之前从数据中删除所有下划线"更好的解决方案?我可以这样做,但这将很痛苦,因为我已经编写的其他代码需要带有下划线的数据。

编辑:如果我那里也有空值怎么办?我可以完全避免使用 json 吗?

关于下划线,诀窍是在转换回数据框时指定dtype=False。这可以防止熊猫错误地将有问题的列视为数字。以下工作按预期工作:

#!/usr/bin/env python3
import pandas as pd
from flask import Flask, render_template, session
import os
app = Flask(__name__)

app.secret_key = os.urandom(28)

@app.route('/first_page', methods=['GET', 'POST'])
def first_page():
d = {'products': ['pencils', 'pens', 'erasers'], 'id_code': ['1_2', '10_7', '12_11']}
df = pd.DataFrame(d)
print(df)
session["data"] = df.to_json()
return render_template('/private/test_page1.html')
@app.route('/second_page', methods=['GET', 'POST'])
def second_page():
dat = session.get('data')
dat = pd.read_json(dat, dtype=False)
print(dat)
return render_template('/private/test_page2.html')


if __name__ == '__main__':
app.run(port=5001,debug=True)
console output:
127.0.0.1 - - [01/Apr/2019 23:38:56] "GET / HTTP/1.1" 404 -
products id_code
0  pencils     1_2
1     pens    10_7
2  erasers   12_11
127.0.0.1 - - [01/Apr/2019 23:39:03] "GET /first_page HTTP/1.1" 200 -
products id_code
0  pencils     1_2
1     pens    10_7
2  erasers   12_11

但是我仍然无法处理空值。

最新更新