2016-06-13 20 views
3

Ich habe ein Problem, wenn ich versuche, die erste Spalte der hochgeladenen CSV-Datei in Django in eine Liste zu konvertieren. Ursprünglich war mein Code wie folgt ohne django mit:Konvertieren hochgeladene CSV-Datei in Liste in Django

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

Aber bei der Entwicklung der Benutzeroberfläche django, ich bin nicht die erforderliche my_list wie oben mit, was mache ich falsch? Ich habe versucht, viele Methoden, die Sie in den kommentierten Codes sehen können:

Hier ist mein 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}) 

Hier mein model.py ist:

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__' 

Ich schätze die Hilfe.

Antwort

0
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)) 

Irgendwie konnte ich es mit dem oben genannten beheben, indem ich auf die lokalen Variablen in der lokalen Host-Seite schaute.

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

DictReader erwartet eine iterable von Strings (in der Regel ein Dateiobjekt), wobei jeder String eine Linie darstellt. Da Sie .read(), paramFile aufgerufen haben, ist eine Zeichenfolge, die eine Anzahl von Strings iterierbar ist, aber jede zurückgegebene Zeichenfolge ist ein Zeichen, keine Zeile. Entfernen Sie die .read().