我正在使用django在python中开发一个应用程序。用户可以上传CSV文件。我使用文件上传来获取文件。但是,它并没有存储在任何地方。我尝试从请求处理文件。当我试图打开文件时,它会出错。我使用python中存在的CSV库进行处理。根据django使用的表单元素和属性。我试图获取上传文件的请求对象也是django设计的对象。
import csv
from rootFolder.UploadFileForm
def uploadFile(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
paramFile = open(request.FILES['uploadFile'], 'rb')
portfolio = csv.DictReader(paramFile)
users = []
for row in portfolio:
users.append(row)
以下行给出错误。
paramFile = open(request.FILES['uploadFile'], 'rb')
给定的错误是:
TypeError: coercing to Unicode: need string or buffer, InMemoryUploadedFile found
如果您对此有任何疑问,请提出您的建议。 提前谢谢。
答案 0 :(得分:15)
适用于 Python 3
import csv
import io
...
csv_file = request.FILES['uploadFile']
decoded_file = csv_file.read().decode('utf-8')
io_string = io.StringIO(decoded_file)
for line in csv.reader(io_string, delimiter=';', quotechar='|'):
print(line)
答案 1 :(得分:10)
无需在文件上打开,它已经打开。你应该能够直接将它传递给DictReader。
答案 2 :(得分:8)
open()将文件名作为参数,而不是文件对象本身。
你可以尝试这样的事情:
paramFile = request.FILES['uploadFile'].read()
portfolio = csv.DictReader(paramFile)
答案 3 :(得分:3)
Django 2,Python 3.6 ,同样的问题,谷歌搜索了半天,这是对我有用的解决方案。
form.is_valid:
csv_file = request.FILES['file']
csv_file.seek(0)
reader = csv.DictReader(io.StringIO(csv_file.read().decode('utf-8')))
for row in reader
.....
.....
此处有详细的文字-> source
答案 4 :(得分:1)
你得到一个TypeError,因为内置函数open需要一个字符串作为文件的路径。
这有用吗?
if form.is_valid():
request.FILES['uploadFile'].open("rb")
portfolio = csv.DictReader(request.FILES['uploadFile'].file)