如何查找Python中是否存在目录


1135

osPython模块中,有一种方法可以查找目录是否存在,例如:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

8
警告词-评分最高的答案可能会受到比赛条件的影响。您可能需要执行该操作os.stat,以查看该目录是否同时存在并且同时是一个目录。
d33tah 2014年

1
@ d33tah您可能有一个很好的观点,但是我看不到一种用于os.stat从文件中分辨目录的方法。OSError无论路径是文件还是目录,当路径无效时都会引发。同样,检查后的任何代码也容易受到竞争条件的影响。
托马什Zato -恢复莫妮卡

4
@TomášZato:得出的结论是,仅执行操作和处理错误是安全的。
d33tah 2015年

2
@ David542我添加了一个澄清案例,用于“ isdir”“ exists”的精度测试。我想您现在会学到任何东西。但这可以照亮新人。
GeoStoneMarten

Answers:


1727

您正在寻找os.path.isdir,还是os.path.exists不在乎它是文件还是目录。

例:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
@syedrakib虽然可以使用括号来表明对象是可调用的,但在Python中却没有用,因为即使类都是可调用的。另外,函数是Python中的一等值,您可以在不带括号的情况下使用它们,例如existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag

10
您可以将函数传递给其他函数,例如map,但是通常情况下,您可以使用参数和括号来调用函数。另外,您的示例中有一些错字。想必你是说filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])
hughdbrown

4
另外,os.path.isfile(path)如果您只关心它是否是一个文件,那就可以了。
Nicholas

2
请注意,在某些平台上,如果文件/目录存在,它们将返回false,但是也会发生读取许可权错误。
cowlinator

73

很近!如果传入当前存在的目录名,则os.path.isdir返回True。如果不存在或不是目录,则返回False


70

蟒3.4引入pathlib模块到标准库,它提供了一个面向对象的方法来处理的文件系统的路径。对象的is_dir()exists()方法Path可用于回答以下问题:

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

路径(和字符串)可以与/运算符连接在一起:

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

也可以通过PyPi上的pathlib2模块在 Python 2.7 上使用Pathlib。


一些解释会有所帮助。您为什么要进行“ p / 'bin' / 'vim'?”
内森

1
@弗兰克我在答案的第二部分做了详细说明。
joelostblom

34

是的,请使用os.path.exists()


23
那不会检查路径是否是目录。
柯克·斯特拉瑟

7
好决定。其他人指出,os.path.isdir将实现这一目标。
aganders3 2012年

3
如果您知道这不能解决问题,那么为什么不删除答案呢?

3
@CamilStaps这个问题已被浏览354000次(至今)。此处的答案不仅适用于OP,而且适用于任何出于任何原因而可以来到这里的人。即使aganders3的回答不能直接解决OP的问题,也很重要。
加百利

4
@Gabriel然后应在答案中明确说明其实际作用。

21

我们可以检查2个内置函数

os.path.isdir("directory")

它将布尔值为true,指定的目录可用。

os.path.exists("directoryorfile")

如果指定的目录或文件可用,它将使boolead为true。

检查路径是否为目录;

os.path.isdir("directorypath")

如果路径为目录,则将为布尔值true


2
对于较旧的最佳答案,这完全是多余的。
戴维斯·鲱鱼


10

如:

In [3]: os.path.exists('/d/temp')
Out[3]: True

可能会折腾os.path.isdir(...)以确保。


10

仅提供os.stat版本(python 2):

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise

7

os为您提供了许多以下功能:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

如果输入路径无效,则listdir将引发异常。


5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')

6
python具有内置函数来创建目录,因此请更好地使用,os.makedirs('mydir')而不是os.system(...)
gizzmole

9
您正在打印“已创建新目录”,但您不知道。如果您没有创建目录的权限怎么办?您将打印“已创建新目录”,但事实并非如此。会的。
Wojciech Jakubas

4

有一个方便的Unipath模块。

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

您可能需要的其他相关事项:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

您可以使用pip安装它:

$ pip3 install unipath

它类似于内置的pathlib。不同之处在于,它将每个路径都视为字符串(Path是的子类str),因此,如果某些函数需要字符串,则可以轻松地将其传递给Path对象,而无需将其转换为字符串。

例如,这在Django和下非常有用settings.py

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'

4

如果目录不存在,您可能还想创建该目录。

Source,如果它仍在SO上。

================================================== ===================

在Python≥3.5上,使用pathlib.Path.mkdir

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

对于旧版本的Python,我看到两个质量很好的答案,每个都有一个小缺陷,因此我将对此进行说明:

试试看os.path.exists,然后考虑os.makedirs创建。

import os
if not os.path.exists(directory):
    os.makedirs(directory)

如注释和其他地方所述,存在竞争条件–如果在os.path.existsos.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,但是假设另一个在第一次检查后创建了目录,然后在第二个检查之前将其删除了–我们仍然可能会上当。

取决于应用程序,并发操作的危险可能比其他因素(例如文件许可权)造成的危险更大或更小。在选择实现之前,开发人员必须了解有关正在开发的特定应用程序及其预期环境的更多信息。

现代版本的Python通过暴露FileExistsError(在3.3+ 版本中)都极大地改善了此代码。

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.

0

两件事情

  1. 检查目录是否存在?
  2. 如果不是,请创建目录(可选)。
import os
dirpath = "<dirpath>" # Replace the "<dirpath>" with actual directory path.

if os.path.exists(dirpath):
   print("Directory exist")
else: #this is optional if you want to create a directory if doesn't exist.
   os.mkdir(dirpath):
   print("Directory created")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.