Python 在Django中从媒体目录打开数据文件
我有一个应用程序,允许用户上传带有数据的CSV文件,然后用图形显示给用户。这些文件保存为“我的媒体”文件夹中的媒体。然而,在我的图形视图中,我需要打开文件并对其进行处理。我的问题是,我只能打开项目当前工作目录中的文件,每当我尝试从该目录之外的某个位置上载文件时,我都会遇到以下错误:Python 在Django中从媒体目录打开数据文件,python,django,file-io,django-media,Python,Django,File Io,Django Media,我有一个应用程序,允许用户上传带有数据的CSV文件,然后用图形显示给用户。这些文件保存为“我的媒体”文件夹中的媒体。然而,在我的图形视图中,我需要打开文件并对其进行处理。我的问题是,我只能打开项目当前工作目录中的文件,每当我尝试从该目录之外的某个位置上载文件时,我都会遇到以下错误: File b'TEST.CSV' does not exist 我尝试过这一点,但没有成功: file_upload_dir = os.path.join(settings.MEDIA_ROOT, 'Data_Fi
File b'TEST.CSV' does not exist
我尝试过这一点,但没有成功:
file_upload_dir = os.path.join(settings.MEDIA_ROOT, 'Data_Files')
data_file = open(os.path.join(file_upload_dir, new_file), 'rb')
变量new_file
只是会话中保存的文件名,而不是该文件的路径Data_Files
是媒体目录中包含上载文件的目录
Django的媒体设置如下
SETTINGS_DIR = os.path.dirname(__file__)
PROJECT_PATH = os.path.join(SETTINGS_DIR, os.pardir)
PROJECT_PATH = os.path.abspath(PROJECT_PATH)
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media')
是否有方法从视图中正确引用媒体文件
这是文件上传目录的输出和新文件的位置
>>> print(file_upload_dir)
C:\\Users\\vut46744\\Desktop\\graphite_project\\media\\Data_Files
>>> print(os.path.join(file_upload_dir, new_file))
C:\\Users\\vut46744\\Desktop\\graphite_project\\media\\Data_Files\\TEST.CSV
通常,您不应该在Django应用程序中使用open()
访问文件。您应该使用存储API。这使您的代码能够很好地使用Django设置和增强此API的潜在第三方应用程序。
所以在这里你应该做一些类似的事情
from django.core.files.storage import default_storage
f = default_storage.open(os.path.join('Data_Files', new_file), 'r')
data = f.read()
f.close()
print(data)
顺便说一句,如果您希望它是模块化的,最好有一个自定义存储类,以便在您的需求发生变化时轻松配置和使用您的应用程序。此外,它还允许将文件放在媒体根目录之外。此示例存储将把它们放入设置中。上载\u ROOT
(如果未找到设置,则默认为媒体\u ROOT
)
我们在这里创建了一个非常简单的存储。它只是普通的一个,但是它从另一个目录读取它的文件。然后,我们设置一个惰性对象,该对象将允许从设置覆盖该存储
因此,现在您的代码变成:
from myapp.storage import uploads_storage
f = uploads_storage.open(new_files, 'r')
在您的设置中,您可以将上传\u ROOT
设置为您喜欢的任何内容。可能是媒体目录之外的内容。如果有一天你决定将上传存储在数据库中,你可以将uploads\u STORAGE
设置为数据库支持的存储,你的代码会很乐意使用它。你能打印file\u upload\u dir和os.path.join(file.upload\u dir,newfile)的结果吗?你有从该目录读取的权限吗?是的,我有读/写权限。当用户通过表单上传文件时,它会保存在媒体文件夹中。然后,我尝试从媒体文件夹访问该文件,但无论出于何种原因,它都表示该文件不存在。当我在假期后返回工作岗位时,我将致力于实施该解决方案,一旦该解决方案生效,我将批准该解决方案作为答案。谢谢你的详细解释。
from myapp.storage import uploads_storage
f = uploads_storage.open(new_files, 'r')