gpt4 book ai didi

python - 从 Django 的媒体目录中打开数据文件

转载 作者:太空狗 更新时间:2023-10-29 22:30:12 27 4
gpt4 key购买 nike

我有一个应用程序,允许用户上传包含数据的 CSV 文件,然后将这些数据绘制成图形并显示给用户。这些文件作为媒体保存在我的媒体文件夹中。然而,在我的图 TableView 中,我需要打开文件并对其进行处理。我的问题是我只能打开项目当前工作目录中的文件,任何时候我尝试从该目录之外的某个地方上传文件时都会收到此错误:

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 只是 session 中保存的文件的名称,而不是该文件的路径。 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')

有没有办法从 View 中正确引用媒体文件?

这是 file_upload_dir 的输出和新文件的位置。

>>> 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 的潜在第三方应用程序一起使用。 https://docs.djangoproject.com/en/1.7/topics/files/#file-storage

所以在这里你应该做类似的事情

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)

顺便说一句,如果您希望它是模块化的,那么拥有一个自定义存储类是个好主意,这样可以在您的需求发生变化时轻松配置和使用您的应用程序。此外,这允许将文件放在 MEDIA_ROOT 之外。此示例存储会将它们放入 settings.UPLOADS_ROOT(如果未找到该设置,则默认为 MEDIA_ROOT)。

# Put this in a storage.py files in your app
from django.conf import settings
from django.core.files.storage import FileSystemStorage, get_storage_class
from django.utils.functional import LazyObject

class UploadsStorage(FileSystemStorage):
def __init__(self, location=None, base_url=None, *args, **kwargs):
if location is None:
location = getattr(settings, 'UPLOADS_ROOT', None)
super(UploadsStorage, self).__init__(location, base_url, *args, **kwargs)
self.base_url = None # forbid any URL generation for uploads

class ConfiguredStorage(LazyObject):
def _setup(self):
storage = getattr(settings, 'UPLOADS_STORAGE', None)
klass = UploadsStorage if storage is None else get_storage_class(storage)
self._wrapped = klass()
uploads_storage = ConfiguredStorage()

我们在这里创建一个非常简单的存储。它只是普通的,但是它从另一个目录读取它的文件。然后我们设置一个惰性对象,允许从设置中覆盖该存储。

现在你的代码变成了:

from myapp.storage import uploads_storage
f = uploads_storage.open(new_files, 'r')

在您的设置中,您可以将 UPLOADS_ROOT 设置为您喜欢的任何内容。可能是你的媒体目录之外的东西。如果有一天您决定将上传存储在数据库中,您可以将 UPLOADS_STORAGE 设置为数据库支持的存储,您的代码将很乐意使用它。

关于python - 从 Django 的媒体目录中打开数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27573124/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com