8👍
You have two problems:
-
You are passing a string to the constructor of
DictReader
. You must pass an iterable object that gives the individual lines in the input (a string is iterable, but will give each character one at a time). Luckily, anUploadedFile
object (like those in theFILES
dictionary) are already file-like objects that support iteration, so just do this:data = csv.DictReader(request.FILES['file'])
-
Your input data only has one line.
DictReader
will use that line for the column “headers”, which will become the key in the resulting dictionaries. You will then have no data left! It looks like you don’t want aDictReader
, just a regualarreader
:data = csv.reader(request.FILES['file'])
47👍
This should work if you’re using 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.
We can use the list that splitlines()
creates. splitlines()
is called because csv.DictReader
expects “any object which supports the iterator protocol and returns a string each time its next() method is called — file objects and list objects are both suitable“.
- How do you actually use a reusable django app in a project?
- ValidationError while using ModelForm Django
- How to have a nested inline formset within a form in Django?
- Django Pandas to http response (download file)
- Using bundle_files = 1 with py2exe is not working
17👍
in Python 3, to get the correct type (String not bytes) without reading the full file into memory you can use a generator to decode line by line:
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)