无法解析使用Flask上传的.csv文件

我正在尝试上传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)

以上是 无法解析使用Flask上传的.csv文件 的全部内容, 来源链接: utcz.com/qa/422456.html

回到顶部