如何使用 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