Django [Errno 2] 没有这个文件或目录:

6
我已经编写了一个脚本来读取Excel文件并将内容保存到我的数据库中。(注意:文件和脚本在不同的目录中)。然而,当我尝试从我的views.py作为简单的导入执行该脚本时,Django会抛出一个错误,说明找不到该文件或目录:
[Errno 2] No such file or directory: '\\media\\documents\\GDRAT.xls\\'

我的脚本中实际的代码如下:

source_wb = xlrd.open_workbook('media/documents/GDRAT.xls')

我的脚本在父目录中。从命令行执行脚本没有问题,所以我不明白为什么django会有不同的读取方式。

我的views.py函数如下(注意:我返回到父目录查找脚本 - 这似乎没问题,但无法找到需要读取的excel文件):

def UpdateGDRAT(request):
    os.chdir('..')
    import GDRAT
    return render_to_response('success.html')

任何指导都非常感激!

脚本的名称是GDRAT.py。 - user3238647
1
为什么你不将它与目录media/连接起来? - Ignacio Vazquez-Abrams
你尝试在 Django 之外的 shell 或终端中使用 xlrd 打开它了吗? - yuvi
3个回答

10

这对我有效

 os.path.join(os.path.dirname(os.path.dirname(__file__)),'media/documents/GDRAT.xls')

4

settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

这段代码与网站的媒体文件有关。MEDIA_ROOT设置指向存储媒体文件的根目录,这里使用os.path.join()函数将BASE_DIR(项目的根目录)和'media'文件夹拼接在一起,从而得到完整的文件路径。
from django.conf import settings
import os


base_dir =settings.MEDIA_ROOT    
my_file = os.path.join(base_dir, str(GDRAT.xls))

3

当你从终端运行脚本时,你有一个当前的工作目录,任何相对路径都是基于这个目录的,但是当你从其他代码中调用同样的脚本时,你的工作目录可能是不同的。

如果你知道文件相对于脚本的位置,我建议你使用动态构建的绝对路径,像这样:

import os
GDRAT_abs_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'media/documents/GDRAT.xls')

__file__提供了当前脚本文件的路径(假设该行代码位于脚本中);
要查看dirname,请参见http://docs.python.org/2/library/os.path.html#os.path.dirname
要查看realpath,请参见http://docs.python.org/2/library/os.path.html#os.path.realpath


我正在尝试实现这个解决方案,但是(file)不会将我的脚本添加到路径中吗?当我在终端中打印GDRAT_abs_path(以查看发生了什么)时,我看到GDRAT.py / media / documents..etc..。如何跳出GDRAT.py但仍然使用动态路径? - user3238647
顺便说一句 - 我能够使用它,但是不得不从GDRAT_abs_path中切片出GDRAT.py并创建一个替代对象 - 有点笨重但是可行的.. - user3238647
哦,你是对的 :) 我应该在 os.path.realpath 中包含 os.path.dirname,我已经修复了答案。 - Matteo Scotuzzi
你还应该使用os.path.join而不是硬编码路径分隔符,在Python的路径操作中,作为一个经验法则,永远不要使用“/”。 - krs
我知道这篇帖子已经有些年头了,但它仍然解决了我的问题。谢谢! - Michael Romrell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接