【问题标题】:Cannot locate csv file when the trigger comes from the frontend with django当触发器来自带有 django 的前端时,无法找到 csv 文件
【发布时间】:2020-01-09 23:36:03
【问题描述】:

简而言之,我希望用户在前端表单中提供文本输入,以定义要检查的数据集,例如“data.csv”。 此“data.csv”作为字符串变量传递给需要打开具有特定名称的数据框的 python 函数。错误是:

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: []

【问题讨论】:

  • 您是否尝试先解码字节串? file = file.decode("utf-8")
  • 嗨。感谢你的回答。它是一个字符串,并且字符串对象没有属性“解码”。这是错误:AttributeError at / 'str' object has no attribute 'decode'
  • 我刚查了一下,Python似乎并不关心文件名是否是字节串,所以不可能是这样。
  • 奇怪的是我的文件名前的字母'b'。 b'data.csv' 不存在:b'data.csv'
  • 是的,这就是为什么我认为字节串可能是问题所在 - 在我的回溯中它不会像那样显示!

标签: python django pandas csv


【解决方案1】:

在 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 可能指向 projectname/projectname/(检查 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)

【讨论】:

  • 是的,但是当我在 PyCharm 的终端中执行文件时,它可以正常读取文件。这和 Django 的执行方式有区别吗?
  • 别担心!是的,如果您想在您的 django 应用程序中测试模块,请运行 python manage.py shell 然后导入您要测试的模块:from myapp.beta import hello 这允许您在 django 应用程序的上下文中运行代码,这非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2014-07-13
相关资源
最近更新 更多