首页 > 解决方案 > 从字符串变量中读取并使用 Python Flask 上传 .txt 文件?

问题描述

我正在尝试使用 Python 和 Flask 构建一个 Web 应用程序以将 .JSON 转换为 .CSV 格式。

这是它应该如何工作的。该应用程序以编程方式从 API 下载 JSON 文件,我需要转换为 .CSV 格式,当用户访问链接时,它应该将 JSON 转换为 .CSV 并且应该自动下载并将其保存在用户的本地磁盘中。

最初,我的方法是在服务器本地磁盘中下载 JSON 文件,并通过创建一个新文件并将其转换为 CSV 文件,并使用 send_file,用户可以下载 CSV 文件。

但是,自从我部署到 Heroku 中后,我意识到 Heroku 文件系统是临时的,我无法存储任何文件。我不得不更改文件概念并通过将其存储到字符串变量来进行转换。

这就是我的代码在部署到 heroku 后的样子。

from flask import Flask,render_template,send_file
import requests
import os
import csv
import json
#import urllib.request



app = Flask(__name__,template_folder='templates')

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/jsonParser')
def jsonParser():
    download_url = "https://www....." #link to .JSON file.

    r = requests.get(download_url)
    x = json.loads(r.content)
    outputArray =  ["id", "phones", "email", "firstname", "lastname","role","username","isActive","_created_at","_updated_at"]
    output = ','.join(outputArray)

        try:
            idValue = x["id"] or x["_id"]
            idValue = str(idValue)
        except:
            idValue = x["_id"] or "nil"

        output2 =   ",".join([ idValue ,
                        x["phones"] or "nil",
                        x["email"] or "nil",
                        x["firstname"] or "nil",
                        x["lastname"] or "nil",
                        str(x["role"]) or "nil",
                        x["username"] or "nil",
                       str(x["isActive"]) or "nil" ,

                        str(x["_created_at"]) or "",
                        str(x["_updated_at"]) or ""]) 
        output =  output + "<br>" + output2 #'\n'.join([output, output2])


    return output


if __name__ == "__main__":
    app.run(debug=True,threaded=True)

所以现在,该output变量由转换后的 .CSV 组成。我想知道是否有任何方法可以将其转换为 .txt 文件,以便用户可以通过访问 /jsonParser 下载它,而无需将 .txt 文件存储在服务器端。

标签: pythoncsvherokuflask

解决方案


那是你想做的吗?你可以这样尝试吗:

from io import StringIO
from flask import Response

@app.route('/jsonParser')
def jsonParser():

    ...

    output = output + "<br>" + output2  # '\n'.join([output, output2])

    string_out = StringIO()
    string_out.write(output)

    returnfile = string_out.getvalue()

    return Response(returnfile, mimetype="text/plain", headers={"Content-disposition": "attachment; filename=output.txt"})

推荐阅读