Python 为什么makedirs()要创建一个空文件而不是文件夹?
我正在创建一个Django应用程序,并使用Python创建一个上载文件夹。目前,我正在使用静态名称进行测试。我的函数只创建一个空文件,而不是一个文件夹 我尝试了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
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 forImageField
表示它从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()中使用完整路径才能在正确的位置创建文件夹。。