python try 嵌套_exception:如何在Python中安全地创建嵌套目录?

检查要写入文件的目录是否存在的最优雅方法是什么,如果不存在,则使用Python创建目录?以下是我的尝试:

import os

file_path ="/my/directory/filename.txt"

directory = os.path.dirname(file_path)

try:

os.stat(directory)

except:

os.mkdir(directory)

f = file(filename)

不知怎么的,我错过了(感谢kanja、Blair和Douglas)。这就是我现在所拥有的:

def ensure_dir(file_path):

directory = os.path.dirname(file_path)

if not os.path.exists(directory):

os.makedirs(directory)

是否有一个"打开"的标志,使这一切自动发生?

通常,您可能需要考虑文件名中没有目录的情况。在我的机器上,dirname('foo.txt')给出",它不存在,并导致makedirs()失败。

在python中2.7 os.path.mkdir不存在。os.mkdir。

如果路径存在,不仅要检查它是否是一个目录,而不是一个普通文件或其他对象(许多答案会检查这个),还需要检查它是否可写(我没有找到检查这个的答案)

如果您来这里创建文件路径字符串p的父目录,下面是我的代码片段:

这个问题答案的元讨论

关于磁盘接近满的情况下的竞争条件,在尝试这样做之前,您可能希望选择性地检查存在的最小(用户可定义的)空闲空间阈值:使用python在卷上保留跨平台空间

我看到了两个有优点的答案,每个都有一个小缺点,所以我将给出我的看法:

尝试os.path.exists,并考虑创建os.makedirs。

import os

if not os.path.exists(directory):

os.makedirs(directory)

正如在评论和其他地方所指出的,有一个比赛条件–如果在os.path.exists和os.makedirs调用之间创建了目录,则os.makedirs将失败,并带有OSError。不幸的是,空格捕获OSError并继续不是万无一失的,因为它将忽略由于其他因素(如权限不足、磁盘已满等)导致的目录创建失败。

一种选择是捕获OSError并检查嵌入的错误代码(参见是否有跨平台的方式从Python的OSError获取信息):

import os, errno

try:

os.makedirs(directory)

except OSError as e:

if e.errno != errno.EEXIST:

raise

或者,可以有第二个os.path.exists,但是假设另一个在第一次检查之后创建了这个目录,然后在第二个&ndash之前删除了它;我们仍然可能被愚弄。

根据应用程序的不同,并发操作的危险可能大于或小于文件权限等其他因素造成的危险。在选择实现之前,开发人员必须对正在开发的特定应用程序及其预期环境有更多的了解。

Python的现代版本在很大程度上改进了这段代码,都是通过在3.3+中公开FileExistsError…

try:

os.makedirs("path/to/directory")

except FileExistsError:

# directory already exists

pass

…并允许一个关键字参数os.makedirs称为exist_ok(在3.2+中)。

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

同意尝试/除非解决方案更好

竞态条件很好,但是stackoverflow.com/questions/273192/#273208中的方法将掩盖创建目录失败。不要因为投反对票而感到难过——你不喜欢这个答案。这就是投票的意义。

记住os.path.exists()不是免费的。如果正常情况下目录在那里,那么不存在目录的情况应该作为异常处理。换句话说,尝试打开并写入文件,捕获OSError异常,并基于errno执行makedir()并重试或重新引发。这将造成代码的重复,除非您将编写封装在本地方法中。

os.path.exists还为文件返回True。我已经贴出了解决这个问题的答案。

正如这里其他答案的评论者所指出的,exists_ok到os.makedirs()的参数可以用来描述如何处理路径的预先存在,从Python 3.2开始。

os.mkdirs()可以创建非预期的文件夹如果路径分隔符被意外遗漏,当前文件夹不符合预期,路径元素包含路径分隔符。如果您使用os.mkdir(),这些bug将引发异常,提醒您它们的存在。

在这个答案中添加pathlib.Path::is_dir和pathlib.Path::mkdir函数可能会有用。在3.4版本的标准库中临时添加的pathlib模块提供了一种面向对象的、与系统无关的路径处理方法。这包括对路径分隔符的处理(通过重载/)。该包也可以通过pip安装到早期版本。

所以实际的答案应该是stackoverflow.com/questions/273192/…

遗憾的是,这被标记为正确,并被提升到1000。您可以而且应该捕捉errno.EEXIST

在Python 3.4中,您可以捕获FileExistsError

这不是一个好建议。看到stackoverflow.com/a/5032238/763269。

@BlairConrad应该不是if e.errno == errno.EEXIST:,因为您想检查错误号是否映射?

但是根据文档,os.makedirs对路径中有pardir的相对路径不起作用:/我如何在不使用绝对路径的情况下解决这个问题?

在python >=3.2中,makedirs有一个exists_ok: os标志。makedirs(path, exist_ok=True)参见这里:stackoverflow.com/questions/600268/…

Python 3.5 +:

import pathlib

pathlib.Path('/my/directory').mkdir(parents=True, exist_ok=True)

pathlib.Path.mkdir如上所述递归地创建目录,如果目录已经存在,则不会引发异常。如果不需要或不希望创建父类,请跳过parents参数。Python 3.2 +:

使用pathlib:

如果可以,安装当前名为pathlib2的pathlib backport。不要安装较老的未维护的backport pathlib。接下来,请参考上面的Python 3.5+部分并使用它。

如果使用Python 3.4,即使它带有pathlib,它也缺少有用的exist_ok选项。backport旨在提供一个更新更好的mkdir实现,其中包括这个缺少的选项。

使用os:

import os

os.makedirs(path, exist_ok=True)

上面使用的os.makedirs递归地创建目录,如果目录已经存在,则不会引发异常。它只有在使用Python 3.2+时才具有可选的exist_ok参数,默认值为False。这个参数在python2中不存在。x到2。7。因此,不需要像Python 2.7那样手工处理异常。Python 2.7 +:

使用pathlib:

如果可以,安装当前名为pathlib2的pathlib backport。不要安装较老的未维护的backport pathlib。接下来,请参考上面的Python 3.5+部分并使用它。

使用os:

import os

try:

os.makedirs(path)

except OSError:

if not os.path.isdir(path):

raise

虽然一个简单的解决方案可能首先使用os.path.isdir,然后使用os.makedirs,但是上面的解决方案颠倒了这两个操作的顺序。这样做可以防止创建目录时出现重复尝试的常见竞争条件,还可以消除目录中的文件歧义。

注意,捕获异常并使用errno用处有限,因为OSError: [Errno 17] File exists即errno.EEXIST对文件和目录都是引发的。更可靠的方法是检查目录是否存在。

选择:

mkpath创建嵌套目录,如果目录已经存在,则不执行任何操作。这在python2和python3中都适用。

import distutils.dir_util

distutils.dir_util.mkpath(path)

对于每个Bug 10948,这种方法的一个严重限制是,对于给定的路径,它只能在每个python进程中工作一次。换句话说,如果你用它来创建一个目录,然后从内部或外部Python删除目录,然后使用mkpath再重新创建相同的目录中,mkpath只会默默使用其无效的缓存信息以前创建的目录,并将不会再让目录。相反,os.makedirs不依赖任何这样的缓存。对于某些应用程序,这种限制可能没有问题。

关于目录的模式,如果您关心的话,请参考文档。

就我所知,这个答案涵盖了几乎所有的特殊情况。我计划用"if not os.path.isdir()"来包装这个目录,因为我希望目录几乎每次都存在,而且我可以通过这种方式避免异常。

@CharlesL。如果您的原因是性能问题,那么异常可能比检查磁盘IO更便宜。

@jpmc26,但是makedirs只在检查是否抛出OSError时执行附加的stat、umask和lstat。

只要有目录分隔符,os.makedirs()就以stat()开始,所以使用os.path.isdir()进行预检查只是额外的工作。

这是错误的答案,因为它引入了一个潜在的FS竞争cond。参见Aaron Hall的回答。

正如@sleepycal所说,这与公认的答案有类似的种族问题。如果在引发错误和检查os.path.isdir其他人删除该文件夹之间,您将引发该文件夹存在的错误、过时且令人困惑的错误。

虽然优雅的pathlib解决方案确实打破了pytest-xdist抱怨mkdir选项…

@Sardathrion好吧,我想你已经确保了相应的问题是开放的。如果这是一个第三方包的问题,这里的评论就不相关了。

@sleepycal关注的种族条件在Heikki Toivonen对许多(大多数)用例(包括我的用例)的回答的评论中得到了解决。如果您担心其他人会删除该目录,那么您仍然需要在稍后使用它之前检查一下。创建多个地方来检查以后需要什么,只会增加复杂性。

在Windows上,如果父目录由管理员拥有,或者其他特殊目录(例如C:\Program Files or ...(x86)或Documents and Settings)导致创建目录失败,那么权限错误会怎样?这段代码是否传播了确切的权限错误?

看起来并不是这样,但是至少在Linux上可以检查可用的权限。我不了解Windows。

注意,在存在与路径中目录的建议名称匹配的文件的情况下,NotADirectoryError: [Errno 20] Not a directory: ...由pathlib.Path('/my/directory').mkdir(parents=True, exist_ok=True)引发,例如,如果my是一个文件。

使用try except和正确的错误代码从errno模块摆脱竞争条件,是跨平台的:

import os

import errno

def make_sure_path_exists(path):

try:

os.makedirs(path)

except OSError as exception:

if exception.errno != errno.EEXIST:

raise

换句话说,我们试图创建目录,但是如果它们已经存在,我们就忽略这个错误。另一方面,任何其他错误都会被报告。例如,如果您预先创建dir 'a'并从中删除所有权限,您将得到一个OSError引发的errno.EACCES(权限被拒绝,错误13)。

反对这样做的共同原因是什么?为什么人们更喜欢if语句而不是try/except?如果你错过了这个错误,try/except会更危险吗?

公认的答案实际上是危险的,因为它有一个种族条件。不过,它更简单,因此,如果您不知道种族条件,或者认为它不适用于您,那么这显然是您的首选。

仅当exception.errno != errno.EEXIST无意中忽略path存在但为非目录对象(如文件)时才引发异常。如果路径是非目录对象,则理想情况下应该引发异常。

注意,上面的代码等价于os.makedirs(path,exist_ok=True)

在Python 3.2中引入了exist_ok参数。它在Python 2.x中不存在。我会把它纳入我的答案。

@Navin, A-B-B:看起来像最近的两个。x构建忽略了EEXIST错误,本质上与上面的代码相同。我签入了2.7.4。

没关系,这只适用于中间路径。在2.7中,叶子目录仍然会引发异常

从技术上讲,如果另一个程序同时修改目录和文件,那么整个程序就是一个巨大的竞争条件。在代码创建这个目录并将文件放入其中之前,如何阻止另一个程序删除这个目录呢?

@jpmc26,从技术上讲,可以使用一个或多个:权限、所有权、咨询锁、强制锁。

@A-B-B所有权只有在您不需要读取相同文件的应用程序的不同实例的情况下才会起作用,在这种情况下,您可以通过意识到您正在访问什么来避免竞争条件。相同的权限。是否存在创建目录并获取锁的原子方法?如果没有,那么在这里给出的特定情况下,这将没有帮助。如果是这样,这个解决方案就不包含它,这意味着它和另一个一样"危险"。

别误会我的意思;我更喜欢这个答案。我只是说安全声明被夸大了。

考虑使用isdir而不是exists——取决于使用情况

这是正确答案。公认的答案不是好建议。

在Python 3.3及以上版本中,您可以使用FileExistsError。

这是最好的答案,我真的不知道"竞态条件"。谢谢!

Downvoted。mkdirs的源代码实际上警告不要检查EEXIST: github.com/python/cpython/blob/…

您正在查看python3。x源代码,上面给出的答案适用于Python 2.7: github.com/python/cpython/blob/2.7/Lib/os.py#L153

没关系。这个问题在2.7中可能没有得到解决,但它仍然存在。

并不是没有竞争条件;它是你的程序不包含两个不同的地方,在那里你可以检测到什么(由于种族)是真正相同的条件。

@DavisHerring What you say is not exactly true.你说错了。当您访问目录或目录内容时,就会发生存在性检查。因此,如果您创建目录,然后在其中打开一个文件,您仍然容易受到相同的竞争条件的影响。答案是好的;如果另一个程序正在修改某些东西,这仍然是不安全的,这是Heikki(不是答案)断言的。

@jpmc26:另一种情况下,竞争实际上更糟:使用if not path.exists(...)并发的mkdir可以给您一个异常(尽管进行了检查)。更广泛地说,支票并不能保护你免受任何种族条件的困扰,所以把它包括在内绝对是不可取的。

@DavisHerring这个答案也不能阻止你处理任何种族条件。如果您的程序与另一个程序竞争目录的控制权,那么您就做错了。

@jpmc26:它防止了mkdir竞争(因为您有两种明确的情况和明显的代码路径来处理它们)。争用不一定是一场"战斗":让几个程序创建目录的不同部分很容易有用。

我个人建议您使用os.path.isdir()而不是os.path.exists()进行测试。

>>> os.path.exists('/tmp/dirname')

True

>>> os.path.exists('/tmp/dirname/filename.etc')

True

>>> os.path.isdir('/tmp/dirname/filename.etc')

False

>>> os.path.isdir('/tmp/fakedirname')

False

如果你有:

>>> dir = raw_input("::")

以及一个愚蠢的用户输入:

:: /tmp/dirname/filename.etc

…如果使用os.path.exists()进行测试,那么当您将该参数传递给os.makedirs()时,将得到一个名为filename.etc的目录。

如果您只使用'isdir',当您尝试创建目录时,如果已经存在同名文件,您是否仍然会遇到问题?

在现有文件上创建目录时产生的异常将正确地将问题反映回调用者。

这是个糟糕的建议。看到stackoverflow.com/a/5032238/763269。

检查操作系统。makedirs:(它确保存在完整的路径。)要处理目录可能存在的事实,请捕获OSError。(如果exist_ok为False(缺省值),如果目标目录已经存在,则会引发OSError。)

import os

try:

os.makedirs('./path/to/somewhere')

except OSError:

pass

使用try/except,您将屏蔽目录创建中的错误,在目录不存在但由于某种原因无法创建的情况下

这是唯一安全的方法。

如果路径是一个现有文件或目录,则在这里将引发OSError。我已经贴出了解决这个问题的答案。

这是一半。在决定忽略它之前,您确实需要检查OSError的子错误条件。看到stackoverflow.com/a/5032238/763269。

从Python 3.5开始,pathlib.Path.mkdir有一个exist_ok标志:

from pathlib import Path

path = Path('/my/directory/filename.txt')

path.parent.mkdir(parents=True, exist_ok=True)

# path.parent ~ os.path.dirname(path)

这将递归地创建目录,如果目录已经存在,则不会引发异常。

(就像os.makedirs从python 3.2 e开始得到一个exist_ok标志一样。g os.makedirs(path, exist_ok=True))

洞察这种情况的具体情况

您在特定路径上给出一个特定的文件,然后从文件路径中提取目录。然后,在确保您拥有目录之后,您尝试打开一个文件以供读取。要对本守则作出评论:

filename ="/my/directory/filename.txt"

dir = os.path.dirname(filename)

我们希望避免覆盖内置函数dir。此外,filepath或者也许fullfilepath可能比filename语义名称更好,所以这样写会更好:

import os

filepath = '/my/directory/filename.txt'

directory = os.path.dirname(filepath)

你的最终目标是打开这个文件,你最初的状态是写,但你实际上是在接近这个目标(基于你的代码),就像这样,打开文件阅读:

if not os.path.exists(directory):

os.makedirs(directory)

f = file(filename)

假设打开读取

为什么要为期望存在并能够读取的文件创建目录呢?

试着打开文件。

with open(filepath) as my_file:

do_stuff(my_file)

如果目录或文件不在那里,您将得到一个IOError和一个关联的错误号:errno.ENOENT将指向正确的错误号,无论您的平台是什么。如果你想的话,你可以抓住它。

import errno

try:

with open(filepath) as my_file:

do_stuff(my_file)

except IOError as error:

if error.errno == errno.ENOENT:

print 'ignoring error because directory or file is not there'

else:

raise

假设我们开始写

这可能就是你想要的。

在这种情况下,我们可能没有面临任何竞争条件。因此,就像您刚才所做的那样,但是请注意,对于编写,您需要使用w模式(或a来添加)打开。使用上下文管理器打开文件也是Python的最佳实践。

import os

if not os.path.exists(directory):

os.makedirs(directory)

with open(filepath, 'w') as my_file:

do_stuff(my_file)

但是,假设我们有几个Python进程试图将它们的所有数据放到同一个目录中。然后我们可能会对目录的创建产生争用。在这种情况下,最好将makedirs调用封装在try-except块中。

import os

import errno

if not os.path.exists(directory):

try:

os.makedirs(directory)

except OSError as error:

if error.errno != errno.EEXIST:

raise

with open(filepath, 'w') as my_file:

do_stuff(my_file)

尝试os.path.exists函数

if not os.path.exists(dir):

os.mkdir(dir)

我想评论一下这个问题,但是我们指的是os.mkdir吗?我的python(2.5.2)没有os.path.mkdir…

没有os.path.mkdir()方法。操作系统。path模块在路径名上实现了一些有用的函数。

这是个糟糕的建议。看到stackoverflow.com/a/5032238/763269。

我把下面的记下来了。不过,这也不是万无一失的。

import os

dirname = 'create/me'

try:

os.makedirs(dirname)

except OSError:

if os.path.exists(dirname):

# We are nearly safe

pass

else:

# There was an error on creation, so make sure we know about it

raise

就像我说的,这并不是万无一失的,因为我们有可能无法创建目录,而另一个进程在此期间创建目录。

stackoverflow.com/questions/273698/…

两个问题:(1)在决定检查os.path.exists之前,您需要检查OSError的子错误条件——请参见stackoverflow.com/a/5032238/763269,(2)在os.path.exists上的成功并不意味着目录存在,而只是路径存在——可以是文件、符号链接或其他文件系统对象。

Check if a directory exists and create it if necessary?

直接的答案是,假设一个简单的情况,您不希望其他用户或进程打乱您的目录:

if not os.path.exists(d):

os.makedirs(d)

或者如果创建目录受竞态条件约束(也就是说,在检查路径是否存在之后,可能已经有其他东西创建了它),则执行以下操作:

import errno

try:

os.makedirs(d)

except OSError as exception:

if exception.errno != errno.EEXIST:

raise

但是,也许一个更好的方法是避开资源争用问题,通过tempfile使用临时目录:

import tempfile

d = tempfile.mkdtemp()

以下是在线文档的要点:

mkdtemp(suffix='', prefix='tmp', dir=None)

User-callable function to create and return a unique temporary

directory.  The return value is the pathname of the directory.

The directory is readable, writable, and searchable only by the

creating user.

Caller is responsible for deleting the directory when done with it.

New in Python 3.5: pathlib.Path with exist_ok

有一个新的Path对象(从3.4开始),其中有许多方法可以用于路径——其中之一是mkdir。

(说到上下文,我用一个脚本跟踪我的每周代表。下面是脚本中的相关代码部分,这些代码允许我避免每天对相同的数据进行多次堆栈溢出。)

首先是相关进口:

from pathlib import Path

import tempfile

我们现在不需要处理os.path.join -只需用一个/连接路径部分:

directory = Path(tempfile.gettempdir()) / 'sodata'

然后我要确保目录存在——Python 3.5中出现了exist_ok参数:

directory.mkdir(exist_ok=True)

以下是文档的相关部分:

If exist_ok is true, FileExistsError exceptions will be ignored (same behavior as the POSIX mkdir -p command), but only if the last path component is not an existing non-directory file.

下面是更多的脚本—在我的例子中,我不受竞态条件的约束,我只有一个进程期望目录(或包含的文件)在那里,并且没有任何东西试图删除目录。

todays_file = directory / str(datetime.datetime.utcnow().date())

if todays_file.exists():

logger.info("todays_file exists:" + str(todays_file))

df = pd.read_json(str(todays_file))

Path对象必须被强制到str,然后期望str路径的其他api才能使用它们。

也许应该更新panda以接受抽象基类os.PathLike的实例。

在Python 3.4中,您还可以使用全新的pathlib模块:

from pathlib import Path

path = Path("/my/directory/filename.txt")

try:

if not path.parent.exists():

path.parent.mkdir(parents=True)

except OSError:

# handle error; you can also catch specific errors like

# FileExistsError and so on.

2.7中也支持它:pypi.python.org/pypi/pathlib

@JanuszSkonieczny在Python 2.7中不支持;只有它被备份到了那里。在Python 3.4中,它是一个内置模块。

支持和备份之间的区别是什么?很有效,不是吗?是的,我们都知道,它不是一个核心py 2。7库,这就是为什么我发布了一个PYPI列表的链接,P

如果注释中的信息在答案中,则注释将被废弃。

@ janusskonieczny pypi.python.org/pypi/pathlib2是较新的支持端口。较老的那个没有维护。

如自述的第一行所述;但是旧的backport对于这里的答案仍然有效。而且没有命名的麻烦。不需要解释为什么以及什么时候为新用户使用pathlib,以及在哪里使用pathlib2,我认为这里的专业人员会找出不赞成的理由;)

相关的Python文档建议使用EAFP编码风格(请求原谅比请求许可更容易)。这意味着代码

try:

os.makedirs(path)

except OSError as exception:

if exception.errno != errno.EEXIST:

raise

else:

print"

BE CAREFUL! Directory %s already exists." % path

比其他选择更好吗

if not os.path.exists(path):

os.makedirs(path)

else:

print"

BE CAREFUL! Directory %s already exists." % path

文档表明这正是由于这个问题中讨论的竞态条件。此外,正如其他人在这里提到的,查询一次而不是两次操作系统具有性能优势。最后,论证放置,可能赞成第二个代码在某些情况下,当开发人员知道应用程序运行环境,只能提倡在特殊情况下,该项目已经成立了一个私人环境本身(以及其他相同的实例程序)。

即使在这种情况下,这也是一个糟糕的实践,可能导致长时间无用的调试。例如,我们为目录设置权限的事实不应该给我们留下这样的印象:权限的设置适合我们的目的。可以使用其他权限挂载父目录。一般来说,程序应该总是正确地工作,程序员不应该期望一个特定的环境。

在Python3中,os.makedirs支持设置exist_ok。默认设置是False,这意味着如果目标目录已经存在,将引发一个OSError。通过将exist_ok设置为True,将忽略OSError(目录存在),并且不会创建该目录。

os.makedirs(path,exist_ok=True)

在Python2中,os.makedirs不支持设置exist_ok。你可以在heikki-toivonen的回答中使用这个方法:

import os

import errno

def make_sure_path_exists(path):

try:

os.makedirs(path)

except OSError as exception:

if exception.errno != errno.EEXIST:

raise

您可以使用mkpath

# Create a directory and any missing ancestor directories.

# If the directory already exists, do nothing.

from distutils.dir_util import mkpath

mkpath("test")

注意,它还将创建祖先目录。

它适用于python2和python3。

distutils.dir_util不是distutil公共API的一部分,在多线程环境中存在问题:bugs.python.org/issue10948

是的。如上所述的第一个消息错误,distutils.dir_util.mkpath的问题是,如果你创建一个目录,然后删除它从内部或外部Python,然后再次使用mkpath, mkpath将简单地使用其无效的缓存信息以前创建的目录,并将不会再让目录。相反,os.makedirs不依赖任何这样的缓存。

我使用os.path.exists(),这是一个Python 3脚本,它可以用来检查目录是否存在,如果不存在,创建一个目录,如果存在,删除它(如果需要)。

它提示用户输入目录,可以很容易地修改。

对于单行解决方案,您可以使用IPython.utils.path.ensure_dir_exists():

from IPython.utils.path import ensure_dir_exists

ensure_dir_exists(dir)

从文档中:确保存在目录。如果它不存在,则尝试创建它,并在另一个进程执行相同操作时防止竞争条件。

这里提供了新的IPython文档。

IPython模块绝对不能保证存在。它在我的Mac上原生存在,但在我安装的任何Python Linux上都没有。基本上,它不是Python模块索引中列出的模块之一。

确定。要安装这个包,只需运行通常的pip install ipython,或者在requirements.txt或pom.xml中包含依赖项。文档:ipython.org/install.html

你可以用os.listdir来做这个:

import os

if 'dirName' in os.listdir('parentFolderPath')

print('Directory Exists')

在处理文件I/O时,要考虑的重要事情是TOCTTOU(检查到使用时间)

因此,使用if进行检查,然后稍后读取或写入可能会导致未处理的I/O异常。最好的方法是:

try:

os.makedirs(dir_path)

except OSError as e:

if e.errno != errno.EEXIS:

raise

这对已经发表的问题有什么补充吗?

我发现了这个Q/A,一开始我对我得到的一些失败和错误感到困惑。我正在使用Python 3 (v3.5在Arch Linux x86_64系统上的Anaconda虚拟环境中工作)。

考虑这个目录结构:

└── output/         ## dir

├── corpus       ## file

├── corpus2/     ## dir

└── subdir/      ## dir

以下是我的实验/笔记,它可以澄清一些事情:

# ----------------------------------------------------------------------------

# [1] https://stackoverflow.com/questions/273192/how-can-i-create-a-directory-if-it-does-not-exist

import pathlib

""" Notes:

1.  Include a trailing slash at the end of the directory path

("Method 1," below).

2.  If a subdirectory in your intended path matches an existing file

with same name, you will get the following error:

"NotADirectoryError: [Errno 20] Not a directory:" ...

"""

# Uncomment and try each of these"out_dir" paths, singly:

# ----------------------------------------------------------------------------

# METHOD 1:

# Re-running does not overwrite existing directories and files; no errors.

# out_dir = 'output/corpus3'                ## no error but no dir created (missing tailing /)

# out_dir = 'output/corpus3/'               ## works

# out_dir = 'output/corpus3/doc1'           ## no error but no dir created (missing tailing /)

# out_dir = 'output/corpus3/doc1/'          ## works

# out_dir = 'output/corpus3/doc1/doc.txt'   ## no error but no file created (os.makedirs creates dir, not files!  ;-)

# out_dir = 'output/corpus2/tfidf/'         ## fails with"Errno 20" (existing file named"corpus2")

# out_dir = 'output/corpus3/tfidf/'         ## works

# out_dir = 'output/corpus3/a/b/c/d/'       ## works

# [2] https://docs.python.org/3/library/os.html#os.makedirs

# Uncomment these to run"Method 1":

#directory = os.path.dirname(out_dir)

#os.makedirs(directory, mode=0o777, exist_ok=True)

# ----------------------------------------------------------------------------

# METHOD 2:

# Re-running does not overwrite existing directories and files; no errors.

# out_dir = 'output/corpus3'                ## works

# out_dir = 'output/corpus3/'               ## works

# out_dir = 'output/corpus3/doc1'           ## works

# out_dir = 'output/corpus3/doc1/'          ## works

# out_dir = 'output/corpus3/doc1/doc.txt'   ## no error but creates a .../doc.txt./ dir

# out_dir = 'output/corpus2/tfidf/'         ## fails with"Errno 20" (existing file named"corpus2")

# out_dir = 'output/corpus3/tfidf/'         ## works

# out_dir = 'output/corpus3/a/b/c/d/'       ## works

# Uncomment these to run"Method 2":

#import os, errno

#try:

#       os.makedirs(out_dir)

#except OSError as e:

#       if e.errno != errno.EEXIST:

#               raise

# ----------------------------------------------------------------------------

结论:在我看来,"方法2"更稳健。

如果目录不存在,我如何创建它?

[2]https://docs.python.org/3/library/os.html os.makedirs

我看到了海基·托伊沃宁和A-B-B的答案,想到了这种变化。

import os

import errno

def make_sure_path_exists(path):

try:

os.makedirs(path)

except OSError as exception:

if exception.errno != errno.EEXIST or not os.path.isdir(path):

raise

如果你考虑以下几点:

os.path.isdir('/tmp/dirname')

表示存在一个目录(路径),并且是一个目录。所以对我来说,这样做是我所需要的。所以我可以确保它是文件夹(而不是文件)并且存在。

如果运行在支持shell语言的机器上,为什么不使用子进程模块呢?在python 2.7和python 3.6上工作

from subprocess import call

call(['mkdir', '-p', 'path1/path2/path3'])

应该对大多数系统都有效。

很好地工作。谢谢。另一方面,如果我尝试这样做,会得到意想不到的结果:call(['mkdir', '-p', 'archive/calls', 'archive/transcript '))

固定的。只是想要一条绝对路径。调用(['mkdir', '-p', '/Users/zog/archive/calls', '/Users/zog/archive/transcript '])

@Geoff Paul Bremner—组合bash调用通常是针对简单os任务的最干净和最简单的解决方案之一,与经典的python解决方案很好地竞争

在程序/项目的入口点调用函数create_dir()。

import os

def create_dir(directory):

if not os.path.exists(directory):

print('Creating Directory '+directory)

os.makedirs(directory)

create_dir('Project directory')

使用此命令检查并创建dir

if not os.path.isdir(test_img_dir):

os.mkdir(str("./"+test_img_dir))

import os

if os.path.isfile(filename):

print"file exists"

else:

"Your code here"

Where your code here is use the (touch) command

这将检查文件是否在那里,如果没有,那么它将创建它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值