我正在尝试编写一些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"
我收集的是上传文件所必需的。
答案 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答案的学分