gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:47 26 4
gpt4 key购买 nike

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

而我读取的文件是

enter image description here

当我迭代 csv.reader 对象时,我做错了什么,没有获得代表 2 行的 2 个列表?

最佳答案

好的,您的脚本 csv.reader 存在一个主要问题,如所述 here需要一个文件对象或至少一个支持迭代器协议(protocol)的对象。您传递的 str 确实实现了迭代器协议(protocol),但它不是遍历行,而是遍历字符。这就是为什么你有这样的输出。

首先,它给出一个单一字符 1csv.reader 将其视为具有一个字段的一行。之后 str 给出另一个单个字符 ,csv.reader 将其视为具有两个空字段的行(因为逗号是字段分隔符)。它会在整个 str 中持续进行,直到耗尽为止。

解决方案(或至少一个解决方案)是将 str 转换为类似文件的对象。我尝试使用 Flask.request.files["name"] 提供的流,但这不会迭代这些行。接下来,我尝试使用 cStringIO.StringIO ,似乎也有类似的问题。我最终得到了 this问题建议在通用换行模式下使用 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)

关于python - 无法解析使用 Flask 上传的 .csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57706052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com