【问题标题】:how to upload and read csv file in django using csv.DictReader?如何使用 csv.DictReader 在 django 中上传和读取 csv 文件?
【发布时间】: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 中的每一行一个?

标签: python django 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'])
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2018-04-29
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多