Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python Flask读取字符串变量并上载.txt文件?_Python_Csv_Heroku_Flask - Fatal编程技术网

使用Python Flask读取字符串变量并上载.txt文件?

使用Python Flask读取字符串变量并上载.txt文件?,python,csv,heroku,flask,Python,Csv,Heroku,Flask,我正在尝试使用Python和Flask构建一个web应用程序,以将.JSON转换为.CSV格式 下面是它应该如何工作。 应用程序以编程方式从API下载JSON文件,我需要将其转换为.CSV格式,当用户访问链接时,它应该将JSON转换为.CSV,并且应该自动下载并将其保存在用户的本地磁盘中 最初,我的方法是在服务器本地磁盘中下载JSON文件,并通过创建新文件将其转换为CSV文件,通过使用send_file,用户可以下载CSV文件 但是,由于我部署到Heroku中,并且我意识到Heroku文件系统是

我正在尝试使用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)
从flask导入flask,呈现\u模板,发送\u文件
导入请求
导入操作系统
导入csv
导入json
#导入urllib.request
app=Flask(\uuuuu name\uuuuuuuuu,template\u folder='templates'))
@应用程序路径(“/”)
def index():
返回渲染模板('index.html')
@app.route(“/jsonParser”)
def jsonParser():
下载_url=”https://www.....“#链接到.JSON文件。
r=requests.get(下载url)
x=json.loads(r.content)
outputArray=[“id”、“电话”、“电子邮件”、“名字”、“姓氏”、“角色”、“用户名”、“isActive”、“\u创建位置”、“\u更新位置”]
输出=','。连接(输出阵列)
尝试:
idValue=x[“id”]或x[“\u id”]
idValue=str(idValue)
除:
idValue=x[“\u id”]或“nil”
output2=“,”.join([idValue,
x[“电话”]或“无”,
x[“电子邮件”]或“无”,
x[“firstname”]或“nil”,
x[“lastname”]或“nil”,
str(x[“角色”])或“无”,
x[“用户名”]或“无”,
str(x[“isActive”])或“nil”,
str(x[“\u在”]处创建)或“,
str(x[“\u更新位置”])或“])
output=output+“
”+output2#'\n.连接([output,output2]) 返回输出 如果名称=“\uuuuu main\uuuuuuuu”: 运行(debug=True,threaded=True)

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

这就是你想做的吗? 你能试一下吗

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"})
从io导入StringIO
从烧瓶导入响应
@app.route(“/jsonParser”)
def jsonParser():
...
output=output+“
”+output2#'\n.连接([output,output2]) string_out=StringIO() 字符串输出。写入(输出) returnfile=string\u out.getvalue() 返回响应(returnfile,mimetype=“text/plain”,标题={“内容处置”:“附件;文件名=output.txt”})
这里似乎有多个问题,你能缩小范围吗
.csv
只是一个文件扩展名,您当然可以将其更改为
.txt
。就这些吗?输出变量仍然是字符串,而不是.CSV格式。只是输出变量包含.CSV文件的内容,但为字符串格式。我想从后端上传字符串,这样用户就可以下载它。这有意义吗?