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

时间:2014-02-25 08:53:45

标签: 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(file)
for line in data:
    #Do stuff here to process csv file

它到达“for data in data”,然后我收到以下错误消息:

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

所以问题是我的文件是二进制文件,但是csv想要一个字符串文件,对吗?知道如何解决这个问题吗?

我遇到的一种可能的解决方法是简单地在不使用csv模块的情况下读取文件的行并手动处理数据,这样可行,但看起来有点过于繁琐。如果可能的话,最好使用Python的csv模块的功能。

上传文件的网络表单具有属性

enctype="multipart/form-data"
我收集的

是上传文件所必需的。

2 个答案:

答案 0 :(得分:5)

在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期望“支持迭代器协议的任何对象,并且每次调用其__next__()方法时都返回一个字符串 - 文件对象和列表对象是两者都适合“。因此,我们可以使用splitlines()创建的列表。

答案 1 :(得分:0)

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

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答案的学分