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

bat*_*man 6 python csv django

我正在通过上传读取csv文件并尝试将所有值存储在列表中

def upload(request):
    paramFile = request.FILES['file'].read()
    data = csv.DictReader(paramFile)
    list1 = []
    for row in data:
        list1.append(row)

    print list1
Run Code Online (Sandbox Code Playgroud)

FILE.CSV

12345,abcdef
Run Code Online (Sandbox Code Playgroud)

产量

[{'1': '', None: ['']}, {'1': '2'}]
Run Code Online (Sandbox Code Playgroud)

我想附加所有值 list1

Jib*_*mes 18

如果您使用的是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.
Run Code Online (Sandbox Code Playgroud)

我们可以使用splitlines()创建的列表.splitlines()因为csv.DictReader期望" 支持迭代器协议的任何对象,并且每次调用next()方法时都返回一个字符串- 文件对象和列表对象都是合适的 ".


小智 9

在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)
Run Code Online (Sandbox Code Playgroud)

  • 或者使用生成器表达式:`reader = csv.DictReader(chunk.decode() for chunk in request.FILES['file'])` (3认同)

Jam*_*urn 6

您有两个问题:

  • 您正在将字符串传递给的构造函数DictReader。您必须传递一个可迭代的对象,该对象在输入中提供各行(字符串是可迭代的,但一次将每个字符赋予一个)。幸运的是,一个UploadedFile对象(如FILES字典中的对象)已经是支持迭代的类似文件的对象,因此只需执行以下操作:

    data = csv.DictReader(request.FILES['file'])
    
    Run Code Online (Sandbox Code Playgroud)
  • 您的输入数据只有一行。 DictReader将使用该行作为“标题”列,这将成为结果字典中的关键字。这样您将没有数据了!看来您不想要a DictReader,只是一个固执reader

    data = csv.reader(request.FILES['file'])
    
    Run Code Online (Sandbox Code Playgroud)