2016-06-14 2 views
1

Я сгенерировал файл csv через свой код, и после его создания он переходит на путь моего проекта, мой проект называется sample, поэтому путь к файлу sample/output.csv .. Я добавил функцию для скачать, и я назвал эту функцию внутри моей основной функции (дома), но загрузка не работает, что я делаю неправильно?скачать csv файл из моего пути к проекту django

def save_file(request): 
    # data = open(os.path.join(settings.PROJECT_PATH,'data/table.csv'),'r').read() 
    response = HttpResponse(content_type='text/csv') 
    response['Content-Disposition'] = 'attachment; filename=output1.csv' 
    return response 


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 =io.TextIOWrapper(request.FILES['pic'].file) 
      portfolio1 = csv.DictReader(paramFile) 
      print(type(paramFile)) 
      users = [] 
      # users = [row["BASE_NAME"] for row in csv_file] 
      # users = zip(*csv_file) 
      # users = [row[0] for row in csv_file] 

      # for row in portfolio1: 
      # users.append(row) 
      users = [row["BASE_NAME"] for row in portfolio1] 
      print(len(users)) 

      my_list = users 
      vectorizer = CountVectorizer() 
      dtm = vectorizer.fit_transform(my_list) 

      lsa = TruncatedSVD(n_components=100) 
      dtm_lsa = lsa.fit_transform(dtm) 
      dtm_lsa = Normalizer(copy=False).fit_transform(dtm_lsa) 
      similarity = np.asarray(numpy.asmatrix(dtm_lsa) * numpy.asmatrix(dtm_lsa).T) 
      # print(1-similarity) 
      k = len(my_list) 
      dist1 = np.subtract(np.ones((k, k), dtype=np.float), similarity) 
      # dist1=similarity 
      # dist1.astype(float) 
      #print(dist1) 
      # print(cosine_similarity(tfidf_matrix[3:4], tfidf_matrix)) 
      # float dist = 1 - similarity; 
      data2 = np.asarray(dist1) 
      arr_3d = data2.reshape((1, k, k)) 
      # arr_3d= 1- arr_3d 
      #print(arr_3d) 

      no_clus = 40 
      for i in range(len(arr_3d)): 
       # print (i+1910) 
       # km = AgglomerativeClustering(n_clusters=no_clus, linkage='ward').fit(arr_3d[i]) 
       km = AgglomerativeClustering(n_clusters=no_clus, linkage='average').fit(arr_3d[i]) 
       # km = AgglomerativeClustering(n_clusters=no_clus, linkage='complete').fit(arr_3d[i]) 
       # km = MeanShift() 
       # km = KMeans(n_clusters=no_clus, init='k-means++') 
       # km = MeanShift() 
       # km = km.fit(arr_3d[i]) 
       # print km 
       labels = km.labels_ 

      csvfile = r'C:\users\A6B0SZZ\PycharmProjects\sample\media\images\export.csv' 

      csv_input = pd.read_csv(csvfile, encoding='latin-1') 
      csv_input['cluster_ID'] = labels 
      csv_input['BASE_NAME'] = my_list 
      csv_input.to_csv('output.csv', index=False) 
      clus_groups = list() 
      for j in range(no_clus): 
       # print(" cluster no %i:%s" % (j, [my_list[i] for i, x in enumerate(labels) if x == j])) 
       list_of_ints = ([my_list[i] for i, x in enumerate(labels) if x == j]) 
       clus_groups.append(' '.join(list_of_ints)) 
      vectorizer = CountVectorizer() 
      dtm = vectorizer.fit_transform(my_list) 

      lsa = TruncatedSVD(n_components=100) 
      dtm_lsa = lsa.fit_transform(dtm) 
      dtm_lsa = Normalizer(copy=False).fit_transform(dtm_lsa) 
      similarity = np.asarray(numpy.asmatrix(dtm_lsa) * numpy.asmatrix(dtm_lsa).T) 
      k = len(my_list) 
      dist1 = 1 - similarity 

      data2 = np.asarray(dist1) 
      arr_3d = data2.reshape((1, k, k)) 
      # arr_3d= 1- arr_3d 

      no_clus = 5 
      for i in range(len(arr_3d)): 
       # print (i+1910) 
       # km = AgglomerativeClustering(n_clusters=no_clus, linkage='ward').fit(arr_3d[i]) 
       # km = AgglomerativeClustering(n_clusters=no_clus, linkage='average').fit(arr_3d[i]) 
       # km = AgglomerativeClustering(n_clusters=no_clus, linkage='complete').fit(arr_3d[i]) 
       km = KMeans(n_clusters=5, init='k-means++') 
       km = km.fit(arr_3d[i]) 
       # print km 
       labels2 = km.labels_ 
       # error = km.inertia_ 
       print(labels2) 

      labels = labels.tolist() 
      labels2 = labels2.tolist() 
      # new=list() 


      csv_input = pd.read_csv(r'C:\users\A6B0SZZ\PycharmProjects\sample\output.csv',encoding='latin-1') 
      labels1 = csv_input['cluster_ID'] 
      new_list = [] 
      for k in labels1: 
       new_list.append(labels2[k]) # lookup the value in list2 at the index given by list1 

      print(new_list) 
      print(len(new_list)) 
      csv_input = pd.read_csv(r'C:\users\A6B0SZZ\PycharmProjects\sample\output.csv',encoding='latin-1') 
      csv_input['cluster_ID'] = labels 
      csv_input['BASE_NAME'] = my_list 
      csv_input['User_Map'] = new_list 
      csv_input.to_csv('output1.csv', index=False) 

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

И мой home.html является:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 
<div style="padding:40px;margin:40px;border:1px solid #ccc"> 
    <h1>Upload the CSV File to Run the Algorithm on:</h1> 
    <form action="#" method="post" enctype="multipart/form-data"> 
     {% csrf_token %} {{form}} 
     <input type="submit" value="Upload" /> 
    </form> 
    {% for img in images %} 
     {{forloop.counter}}.<a href="{{ img.pic.url }}">{{ img.pic.name }}</a> 
     ({{img.upload_date}})<hr /> 
    {% endfor %} 

</div> 
</body> 
</html> 

Url.py:

from django.conf.urls import url 
from django.contrib import admin 
from django.conf import settings 
from django.conf.urls.static import static 

urlpatterns = [ 
    url(r'^upload/$', 'uploader.views.home', name='labels'), 
    url(r'^admin/', admin.site.urls), 
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

Edit, моя функция теперь: но до сих пор не работает:

def save_file(request): 
    # data = open(os.path.join(settings.PROJECT_PATH,'data/table.csv'),'r').read() 
    # file_path = r'C:\users\A6B0SZZ\PycharmProjects\sample\output1.csv' 
    # fsock = open(file_path, "r") 
    fsock= pd.read_csv(r'C:\users\A6B0SZZ\PycharmProjects\sample\output1.csv', encoding='latin-1') 
    response = HttpResponse(fsock, content_type='text/csv') 
    response['Content-Disposition'] = 'attachment; filename=output1.csv' 
    return response 
+0

Edit, я ставлю операторы печати внутри save_file функции, и они печатают отлично! – Lelo

ответ

0

Я закончил его с помощью FILEwrapper:

def send_file(request): 

    filename = settings.MEDIA_ROOT +'/'+ 'output1.csv' 
    #filename= r"C:\Users\A6B0SZZ\PycharmProjects\sample\media\output1.csv" 
    download_name ="output1.csv" 
    wrapper  = FileWrapper(open(filename)) 
    response  = HttpResponse(wrapper,content_type='text/csv') 
    response['Content-Disposition'] = "attachment; filename=%s"%download_name 
    return response 
0

Если вы хотите отправить файл в браузер таким образом, файл должен быть не каталогом, напрямую доступным веб-сервером. В большинстве случаев папка, в которой хранится весь код Python, не является доступной.

Попробуйте поместить файл в каталог, доступный веб-серверу. Другой способ отправки файла - прочитать его через Python и отправить его в виде строки, как это делает пользователь в этом вопросе: django return file over HttpResponse - file is not served correctly

+0

Я передал его сейчас как вопрос, который вы упомянули, однако он все еще не работает, может быть, я не вызываю функцию прямо внутри домашней функции? – Lelo

+0

Какая ошибка вы получаете? Файл не найден? Попробуйте добавить дополнительную информацию, чтобы решить эту проблему. – arnau

1

Для основной проблемы, когда ваша загрузка не работает, пожалуйста, взгляните на this answer, потому что первый аргумент для вашего HttpResponse должны быть ваши данные для фактической отправки.

Теперь вам также стоит посмотреть на взаимодействие с классами хранения & MEDIA_ROOT.

Это позволит вашему проекту работать локально или удаленно на сервере. Глядя на то, что вы опубликовали я предполагаю, что ваш settings.py содержит что-то вроде MEDIA_ROOT = 'C:\users\A6B0SZZ\PycharmProjects\sample\media'

Вы могли бы хотеть рассмотреть некоторые более общие, многоразовые пути в вашем settings.py (в зависимости от того, как структурирован ваш проект, но это то, что у меня есть);

SETTINGS_DIR = os.path.dirname(os.path.abspath(__file__)) 
PROJECT_DIR = os.path.abspath(os.path.join(SETTINGS_DIR, '../')) 
BASE_DIR = os.path.abspath(os.path.join(PROJECT_DIR, '../')) 

STATIC_ROOT = os.path.join(BASE_DIR, 'static-collection') 
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 

Некоторое хорошее чтение здесь будет Managing Files, который берет вас за различными способами для создания файлов & доступа к их путям.

+0

что у меня в настройке.py есть: MEDIA_ROOT = os.path.join (BASE_DIR, 'media') MEDIA_URL = '/ media /' – Lelo

+0

Это хороший момент, я читаю путь к файлу много в своей домашней функции , как заменить этот C: \ users \ A6B0SZZ \ PycharmProjects \ sample \ output.csv '? Я предполагаю, что это не сработает, как только оно будет преобразовано в сервер или будет использоваться другим компьютером. – Lelo

+0

Можете ли вы использовать ответ на мой вопрос, как это было похоже на ответ в упомянутой вами ссылке, я пробовал, но не работал, как указать там строки? – Lelo

Смежные вопросы