【问题标题】:Convert uploaded csv file into list in Django将上传的 csv 文件转换为 Django 中的列表
【发布时间】:2016-10-14 08:38:35
【问题描述】:

我在尝试将 django 中上传的 csv 文件的第一列转换为列表时遇到问题。本来我的代码是这样的,没有使用django:

with open("export.csv") as f:
    my_list = [row["BASE_NAME"] for row in DictReader(f)]

但是当使用django 开发用户界面时,我没有上面所需的my_list,我做错了什么?我尝试了许多您可以在注释代码中看到的方法:

这是我的view.py:

def handle_csv_data(csv_file):

    logging.warning('Watch out!')  # will print a message to the console
    #print(csv_file)
   # with open(csv_file) as f:
    #    my_list = [row["BASE_NAME"] for row in DictReader(f)]
    users = []
    for row in csv_file:
        users.append(row)

    return (users)

def home(request):
    if request.method=="POST":
        img = UploadForm(request.POST, request.FILES)
        if img.is_valid():
            logging.warning('Watch out!')  # will print a message to the console
           # paramFile = request.FILES['pic']
            paramFile =TextIOWrapper(request.FILES['pic'].file).read()
            portfolio1 = csv.DictReader(paramFile)

          #  portfolio = csv.DictReader(request.FILES['pic'].file)
           # csv_file = request.FILES['pic'].file
           # with open(default_storage.path('images/' + "500 clusters.csv"), 'wb+') as destination:
           #     for chunk in csv_file.chunks():
           #         destination.write(chunk)
           # ifile = open("500 clusters.csv", "r")
          #  data = [row for row in DictReader(csv_file.read().splitlines())]
           # print(users)
          #  paramFile = csv_file.read()
          #  portfolio1 = csv.DictReader(paramFile)
            #ifile = open('sample.csv', "r")
            #read = csv.reader(ifile)
            #for row in read:
             #   print(row)
            #data = [row for row in DictReader(csv_file.read().splitlines())]
          #  for row in portfolio:
           #    my_list = [row["BASE_NAME"]]

            #print(my_list)
            portfolio= handle_csv_data(portfolio1)
            print(portfolio)
           # my_list = portfolio

           # return HttpResponseRedirect(reverse('portfolio'))
            return render(request, 'home.html', {'portfolio': portfolio})
    else:
        img=UploadForm()
    images=Upload.objects.all()
    return render(request,'home.html',{'form':img,'images':images})

这是我的model.py:

from django.db import models
from django.forms import ModelForm

class Upload(models.Model):
    pic = models.FileField("pic", upload_to="images/")
    upload_date=models.DateTimeField(auto_now_add =True)

# FileUpload form class.
class UploadForm(ModelForm):
    class Meta:
        model = Upload
    fields = '__all__' 

感谢您的帮助。

【问题讨论】:

    标签: python django csv django-forms django-views


    【解决方案1】:

    你的代码有问题:

    paramFile =TextIOWrapper(request.FILES['pic'].file).read()
    portfolio1 = csv.DictReader(paramFile)
    

    DictReader 需要一个可迭代的字符串(通常是一个文件对象),其中每个字符串代表一行。因为您调用了.read(),所以paramFile 是一个字符串,它是字符串的可迭代对象,但每个产生的字符串都是一个字符,而不是一行。删除.read()

    【讨论】:

    • 为什么要拨打.read()?这意味着paramFile 是单个字符串,并且迭代会产生单个字符。
    • @MartijnPieters 我在引用 OP 的代码,我已经澄清了。
    • 啊,确实,我读得还不够远。您可以通过在顶部发布 OP 应该做的事情来改进事情!
    【解决方案2】:
       paramFile =io.TextIOWrapper(request.FILES['pic'].file)
       portfolio1 = csv.DictReader(paramFile)
       print(type(paramFile))
        users = []
        users = [row["BASE_NAME"] for row in portfolio1]
        print(len(users))
    

    通过查看本地主机页面中的局部变量,我能够以某种方式修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-13
      • 2016-01-15
      • 2016-07-11
      • 1970-01-01
      • 2019-12-22
      • 2014-03-01
      • 2019-02-01
      • 1970-01-01
      相关资源
      最近更新 更多