我正在尝试上传CSV文件,对其进行处理以产生结果,然后写回(下载)包含结果的新CSV文件。我对Flask非常陌生,无法获得“合适的” csv.reader
对象进行迭代和处理。这是到目前为止的代码,
__author__ = 'shivendra'
from flask import Flask, make_response, request
import csv
app = Flask(__name__)
def transform(text_file_contents):
return text_file_contents.replace("=", ",")
@app.route('/')
def form():
return """
<html>
<body>
<h1>Transform a file demo</h1>
<form action="/transform" method="post" enctype="multipart/form-data">
<input type="file" name="data_file" />
<input type="submit" />
</form>
</body>
</html>
"""
@app.route('/transform', methods=["POST"])
def transform_view():
file = request.files['data_file']
if not file:
return "No file"
file_contents = file.stream.read().decode("utf-8")
csv_input = csv.reader(file_contents)
print(file_contents)
print(type(file_contents))
print(csv_input)
for row in csv_input:
print(row)
result = transform(file_contents)
response = make_response(result)
response.headers["Content-Disposition"] = "attachment; filename=result.csv"
return response
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5001, debug=True)
终端输出为
127.0.0.1 - - [12/Oct/2015 02:51:53] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Oct/2015 02:51:59] "POST /transform HTTP/1.1" 200 -
4,5,6
<class 'str'>
<_csv.reader object at 0x105149438>
['1']
['', '']
['2']
['', '']
['3']
[]
['4']
['', '']
['5']
['', '']
['6']
而我读的文件是
我在重复csv.reader对象时没有得到代表2行的2个列表,这是我做错了什么?
因此你的脚本存在一个主要问题,csv.reader
如此处所述,它需要一个文件对象或至少一个支持迭代器协议的对象。你传递的str确实实现了迭代器协议,但是与其遍历各行,而是遍历这些字符,而不是遍历这些行。这就是为什么要执行输出的原因。
首先,它给出一个单一字符1,该字符csv.reader
被视为具有一个字段的线。之后,str给出另一个字符,,该字符csv.reader
被视为带有两个空字段的行(因为逗号是字段分隔符)。整个过程str
一直如此,直到用尽为止。
解决方案(或至少一种解决方案)是将str变成一个文件状对象。我尝试使用所提供的流flask.request.files["name"]
,但这并没有遍历所有行。接下来,我尝试使用cStringIO.StringIO
和似乎有类似的问题。我最终想到了这个问题,该问题建议使用io.StringIO
通用换行模式的对象起作用。我最终得到了以下工作代码(也许可能会更好):
__author__ = 'shivendra'
from flask import Flask, make_response, request
import io
import csv
app = Flask(__name__)
def transform(text_file_contents):
return text_file_contents.replace("=", ",")
@app.route('/')
def form():
return """
<html>
<body>
<h1>Transform a file demo</h1>
<form action="/transform" method="post" enctype="multipart/form-data">
<input type="file" name="data_file" />
<input type="submit" />
</form>
</body>
</html>
"""
@app.route('/transform', methods=["POST"])
def transform_view():
f = request.files['data_file']
if not f:
return "No file"
stream = io.StringIO(f.stream.read().decode("UTF8"), newline=None)
csv_input = csv.reader(stream)
#print("file contents: ", file_contents)
#print(type(file_contents))
print(csv_input)
for row in csv_input:
print(row)
stream.seek(0)
result = transform(stream.read())
response = make_response(result)
response.headers["Content-Disposition"] = "attachment; filename=result.csv"
return response
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5001, debug=True)
在客户端,我使用AngularJS: 并呼叫: 在服务器端我使用WebAPI2:
问题内容: 使用nodejs,我想解析一个包含10000条记录的.csv文件,并对每一行进行一些操作。我尝试使用http://www.adaltas.com/projects/node- csv 。我无法让它在每一行暂停。这只会读取所有10000条记录。我需要执行以下操作: 逐行读取csv 在每条线上执行耗时的操作 转到下一行 有人可以在这里提出其他建议吗? 问题答案: 好像您需要使用一些基于流的
使用nodejs,我想解析一个包含10000条记录的.csv文件,并对每一行执行一些操作。我尝试使用http://www.adaltas.com/projects/node-csv。我不能让它每排都停下来。这只是读取所有的10000个记录。我需要做到以下几点: 逐行读取csv 对每行执行耗时操作 转到下一行
问题内容: 有没有办法用Flask接收多个上传的文件?我尝试了以下方法: 然后打印内容 如果我上传多个文件,它将仅打印该集中的第一个文件: 是否可以使用Flask的内置上传处理方式接收多个文件?谢谢你的帮助! 问题答案: 你可以使用flask.request.files的方法getlist,例如:
问题内容: 我想用php上传一个csv文件。上传文件后,我想显示CSV文件的数据。我想举一个如何完成这项任务的例子。 问题答案: 尽管您可以轻松找到如何使用php处理文件上传的教程,并且有一些功能(手动)可以处理CSV,但是我将发布一些代码,因为几天前我从事一个项目,其中包括一些代码,您可以采用… HTML: PHP: 我知道必须有一种更简单的方法来执行此操作,但是我读取了CSV文件并将每个记录的
在Flask中处理文件上传非常简单。 它需要一个enctype属性设置为的HTML表单,将该文提交到指定URL。 URL处理程序从对象中提取文件并将其保存到所需的位置。 每个上传的文件首先保存在服务器上的临时位置,然后再保存到最终位置。 目标文件的名称可以是硬编码的,也可以从对象的属性中获取。 但是,建议使用函数获取它的安全版本。 可以在Flask对象的配置设置中定义默认上传文件夹的路径和上传文件