如何使用Python 3处理从web表单上传的csv文件?

如何使用Python 3处理从web表单上传的csv文件?,csv,python-3.x,wsgi,Csv,Python 3.x,Wsgi,我试图编写一些Python 3代码来处理通过web表单上传的csv文件(使用wsgi)。我已经设法让文件上传,但我正在努力使用Python的csv工具来处理它。这似乎与字节和字符串有关 以下是我尝试过的: import cgi, csv form = cgi.FieldStorage(fp=environ['wsgi.input'],environ=environ) upload = form['upload'] file = upload.file data = csv.DictReader(

我试图编写一些Python 3代码来处理通过web表单上传的csv文件(使用wsgi)。我已经设法让文件上传,但我正在努力使用Python的csv工具来处理它。这似乎与字节和字符串有关

以下是我尝试过的:

import cgi, csv
form = cgi.FieldStorage(fp=environ['wsgi.input'],environ=environ)
upload = form['upload']
file = upload.file
data = csv.DictReader(file)
for line in data:
    #Do stuff here to process csv file
它到达“for line in data”,然后我得到以下错误消息:

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
所以问题是我的文件是二进制的,但是csv想要一个字符串文件,对吗?你知道我该怎么解决这个问题吗

我想到的一个可能的解决方法是,不使用csv模块而直接读取文件行,然后手动处理数据,这会起作用,但似乎有点不方便。如果可能的话,最好使用Python的csv模块的功能

从中上载文件的web表单具有

enctype="multipart/form-data"

我收集的数据是上传文件所必需的。

在Python 3中,
cgi
文档说:然后可以从
file
属性中随意读取数据(
read()
readline()
方法将返回字节)。但是,
csv.DictReader
希望迭代器返回字符串,而不是字节

我想试试这个:

import cgi, csv
form = cgi.FieldStorage(fp=environ['wsgi.input'],environ=environ)
upload = form['upload']
str_file_value = upload.value.decode('utf-8')  # put correct encoding here
file = str_file_value.splitlines()
data = csv.DictReader(file)
for line in data:
    #Do stuff here to process csv file

调用
splitlines()
是因为
csv.DictReader
期望“任何支持迭代器协议并在每次调用其
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,我们可以使用
splitlines()
创建的列表。

使用flask,我是这样做的。也许对某人有用

file = request.files['file_uploaded']
str_file_value = file.read().decode('utf-8')
file_t = str_file_value.splitlines()
csv_reader = csv.reader(file_t, delimiter=',')
for row in csv_reader:
    # Do stuff here to process csv file
pd:@tsroten答案的学分