我正在通过上传阅读csv文件并尝试将所有值存储在列表中
def upload(request):
paramFile = request.FILES['file'].read()
data = csv.DictReader(paramFile)
list1 = []
for row in data:
list1.append(row)
print list1
FILE.CSV
12345,abcdef
输出
[{'1': '', None: ['']}, {'1': '2'}]
我想在list1
答案 0 :(得分:13)
如果您使用的是Python 3,这应该可以使用。
file = request.FILES['file']
decoded_file = file.read().decode('utf-8').splitlines()
reader = csv.DictReader(decoded_file)
for row in reader:
# Get each cell value based on key-value pair.
# Key will always be what lies on the first row.
我们可以使用splitlines()
创建的列表。调用splitlines()
是因为csv.DictReader
期望“支持迭代器协议的任何对象,并且每次调用 next ()方法时都返回一个字符串 - 文件对象和列表对象都适合“。
答案 1 :(得分:8)
def decode_utf8(input_iterator):
for l in input_iterator:
yield l.decode('utf-8')
def upload(request):
reader = csv.DictReader(decode_utf8(request.FILES['file']))
for row in reader:
print(row)
答案 2 :(得分:6)
你有两个问题:
您正在将字符串传递给DictReader
的构造函数。您必须传递一个可迭代对象,该对象在输入中提供单独的行(一个字符串是可迭代的,但每次只给一个字符一个)。幸运的是,UploadedFile
对象(就像FILES
字典中的对象)已经是支持迭代的类文件对象,所以就这样做:
data = csv.DictReader(request.FILES['file'])
您的输入数据只有一行。 DictReader
将使用该行作为列#34;标题",这将成为结果词典中的关键字。那么你将没有数据!看起来你不想要一个DictReader
,只是一个标准reader
:
data = csv.reader(request.FILES['file'])