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

Posted

技术标签:

【中文标题】如何使用 csv.DictReader 在 django 中上传和读取 csv 文件?【英文标题】:how to upload and read csv file in django using csv.DictReader? 【发布时间】:2014-09-02 11:40:21 【问题描述】:

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

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

    print list1

文件.csv

12345,abcdef

输出

['1': '', None: [''], '1': '2']

我想追加list1中的所有值

【问题讨论】:

您的预期输出是什么?是[12345: 'abcdef']吗? 然后呢?这里有什么问题? 我希望最终列表为 list1 = ['12345', 'abcdef'] 我看不出和字典有什么关系,那你为什么用DictReader @shashisp 你确定你不想要一个列表列表:[['12345', 'abcdef'], ...]? CSV 中的每一行一个? 【参考方案1】:

如果您使用的是 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() 方法时都会返回一个字符串 — 文件对象和列表对象都适用”。

【讨论】:

关于 decoded_file 变量的好注释。这让我整个下午都被难住了,那条线有帮助,谢谢!【参考方案2】:

在 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)

【讨论】:

或者使用生成器表达式:reader = csv.DictReader(chunk.decode() for chunk in request.FILES['file']) 如果分块算法将一个多字节的 UTF-8 字符分开怎么办?这将导致 UnicodeDecodeError。【参考方案3】:

你有两个问题:

您将一个字符串传递给DictReader 的构造函数。您必须传递一个可迭代对象,该对象提供输入中的各个行(字符串是可迭代的,但每次将给每个字符一个)。幸运的是,UploadedFile 对象(如 FILES 字典中的对象)已经是支持迭代的类文件对象,所以只需这样做:

data = csv.DictReader(request.FILES['file'])

您的输入数据只有一行。 DictReader 将使用该行作为“标题”列,这将成为结果字典中的键。然后您将没有任何数据!看起来你不需要DictReader,只需要一个普通的reader

data = csv.reader(request.FILES['file'])

【讨论】:

以上是关于如何使用 csv.DictReader 在 django 中上传和读取 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章

CSV DictReader,如何强制“”中的部分作为列表而不是字符串读取

如果我使用itertool中的islice从第5行开始,如何使用DictReader?

带有 UTF-8 数据的 Python CSV DictReader

如何复制python DictReader对象?

在 python 中使用 csv.DictReader 进行数据类型转换的最快方法

从 csv.DictReader 中查找字典值