Python 为什么makedirs()要创建一个空文件而不是文件夹?

Python 为什么makedirs()要创建一个空文件而不是文件夹?,python,django,Python,Django,我正在创建一个Django应用程序,并使用Python创建一个上载文件夹。目前,我正在使用静态名称进行测试。我的函数只创建一个空文件,而不是一个文件夹 我尝试了mkdir()和makedirs(),结果相同。我正在Windows10上测试 这在我的模型中: def uploadloc(self, irun): if not os.path.exists('device1'): os.makedirs('device1') return 'device1' iima

我正在创建一个Django应用程序,并使用Python创建一个上载文件夹。目前,我正在使用静态名称进行测试。我的函数只创建一个空文件,而不是一个文件夹

我尝试了
mkdir()
makedirs()
,结果相同。我正在Windows10上测试

这在我的模型中:

def uploadloc(self, irun):
    if not os.path.exists('device1'):
        os.makedirs('device1')
    return 'device1'
iimage = models.ImageField(null=True, default=None, upload_to=uploadloc)
我认为这应该是创建一个文件夹,但它只是创建一个空文件
irun
当前未使用。

Django for
ImageField
表示它从
FileField
继承其参数,其中
upload\u to
参数的语义为:

FileField.上传到
此属性提供了一种设置 上传目录和文件名,可通过两种方式设置。两者 在某些情况下,该值会传递给
存储.save()
方法

如果指定字符串值,它可能包含
strftime()
格式, 将替换为文件上载的日期/时间(以便 上载的文件不会填满给定的目录)。例如:

类MyModel(models.Model):
#文件将上载到媒体\u根目录/上载
upload=models.FileField(upload_to='uploads/')
#或者。。。
#文件将保存到MEDIA_ROOT/uploads/2015/01/30
upload=models.FileField(upload_to='uploads/%Y/%m/%d/')
如果使用默认的
文件系统存储
,则字符串值将为 附加到您的
MEDIA\u根目录
路径以在本地计算机上形成位置 将存储上载文件的文件系统。如果您使用的是 不同的存储,请查看该存储的文档以了解它是如何工作的 处理
上传到

upload\u to
也可以是可调用的,例如函数。这将是 调用以获取上载路径,包括文件名。这 callable必须接受两个参数并返回Unix样式的路径(带 正向斜杠)传递到存储系统

您的callable接受了错误数量的参数(
self
不计算在内),而且由于其返回值意味着包含文件名,所以。。。是的。当它将
'default1'
返回到
ImageField()
时,这就是创建空文件的原因,使用
upload\u to
callable提供给它的名称


如果成功的话,
os.makedirs()
会在其他地方完全创建该目录。

我理解这一点。但我甚至不能走那么远,因为它没有创建文件夹。我猜是的,就在其他地方。(最有可能是脚本的当前工作目录。它不是
MEDIA\u ROOT
),然后当它返回“default1”时,它将用作
MEDIA\u ROOT
输出目录中的文件名。我看到它正在正确的预期文件夹中创建。但是它是一个名为“device1”的空文件,不是一个文件夹。下面是一个可以执行的测试:将可调用文件更改为
os.makedirs('foldername')
,但
返回“othername”
。我怀疑您会发现创建空文件的是
ImageField()
调用(基于返回给它的字符串),而不是您的
os.makedirs()
。我知道我的错误了!非常感谢。我可以将一条评论标记为正确答案吗?测试前是否删除了文件
device1
?并检查它在哪个文件夹中运行代码-
os.getcwd()
(当前工作目录)-因为它可以在不同的位置创建此文件夹,而不是您期望的位置。我看到它在正确的预期文件夹中创建。但它是名为“device1”的空文件,不是文件夹。
makedirs
无法创建文件-因此必须在运行
uploadloc
之前创建文件,
存在('device1')
提供已存在对象(文件或文件夹)的信息如果名为
'device1'
且无法创建名为
'device1'
的文件夹,我最好检查
os.getcwd()
,因为它可能运行
exists()
makdirs()
在不同的文件夹中,然后您希望它已经在不同的位置创建了
'device1'
,您可能需要在
exists()
makedirs()中使用完整路径才能在正确的位置创建文件夹。。