如何使用csv.DictReader上传和读取django中的csv文件?

时间:2014-07-11 18:55:41

标签: python django csv

我正在通过上传阅读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

中附加所有值

3 个答案:

答案 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)

在Python 3中,要获得正确的类型(字符串而不是字节)而不将完整的文件读入内存,您可以使用生成器逐行解码:

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'])