我正在通过上传读取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)
您有两个问题:
您正在将字符串传递给的构造函数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) 归档时间: |
|
查看次数: |
13103 次 |
最近记录: |