Не удается найти CSV-файл, когда триггер поступает из внешнего интерфейса с django - PullRequest
0 голосов
/ 10 января 2020

В нескольких словах я хочу, чтобы пользователь дал текстовый ввод в форме внешнего интерфейса, чтобы определить набор данных, который нужно проверить, например, «data.csv». Этот data.csv передается в виде строковой переменной в функцию python, которая должна открыть фрейм данных с указанным именем c. Ошибка:

FileNotFoundError at /
[Errno 2] File b'data.csv' does not exist: b'data.csv'
Request Method: POST
Request URL:    http://127.0.0.1:8000/
Django Version: 2.2.5
Exception Type: FileNotFoundError
Exception Value:    
[Errno 2] File b'data.csv' does not exist: b'data.csv'

Файл data.csv находится в том же каталоге, что и файл beta.py, который вызывает файл для его чтения. Более того, если я не передаю какое-либо значение со стороны внешнего интерфейса, а просто запускаю скрипт, и вместо dataframe = pd.read_csv(file) у меня появляется dataframe = pd.read_csv('data.csv'), это выдает мне ту же ошибку, но если я выполню скрипт из командная строка, то все работает просто отлично. Поэтому я не могу понять, почему скрипт не может найти data.csv, если триггер происходит из внешнего интерфейса.

Это коды. PS: Спасибо всем заранее за помощь

views.py

def get_name(request):
  if request.method == 'POST':
    form = NameForm(request.POST)
    if form.is_valid():
        file = form.cleaned_data.get('your_name')
        beta.hello(file)
        return HttpResponseRedirect('/thanks/')

# if a GET (or any other method) we'll create a blank form
  else:
    form = NameForm()

return render(request, 'home.html', {'form': form})

beta.py

import pandas as pd

def hello(file):
   dataframe = pd.read_csv(file)

home. html

    <form action="/" method="post">
         {% csrf_token %}
          <label for="your_name">Your name: </label>
          <input id="your_name" type="text" name="your_name">
          <input type="submit" value="OK">
    </form>

ОБНОВЛЕНИЕ:

def hello(s):
    file = 'data.csv'.encode("utf-8")
    print(type(file))
    #dataframe = pd.read_csv(io.StringIO(str(s)))
    dataframe = pd.read_csv(io.BytesIO(file))
    print("---")
    print(dataframe)




*** Results ***
<class 'str'>
<class 'bytes'>
---
Empty DataFrame
Columns: [data.csv]
Index: []

1 Ответ

0 голосов
/ 10 января 2020

Почти всегда хорошей идеей является создание абсолютных путей в Django, так как вы никогда не знаете, где находится интерпретатор во время выполнения. В вашем случае django, скорее всего, ищет data.csv в базовой директории вашего проекта, а не там, где находится ваш views.py.

import pandas as pd
from django.conf import settings

def hello(file):
    print(settings.BASE_DIR)
    fpath = os.path.join(
        settings.BASE_DIR,
        'appname',
        file
    )
    dataframe = pd.read_csv(fpath)

Если это не сработает, BASE_DIR, вероятно, указывает на имя проекта / имя проекта / (проверьте вывод печати из hello ()). Создайте новую переменную в settings.py и используйте ее вместо BASE_DIR (в моем случае это происходит по некоторым причинам):

# Build paths inside the project like this: os.path.join(settings.TOP_DIR,...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TOP_DIR = os.path.dirname(BASE_DIR)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...