Python проверка существования папки в папке

How do I check if a directory exists in Python?

A word of warning — the highest rated answer might be susceptible to race conditions. You might want to perform os.stat instead, to see if the directory both exists and is a directory at the same moment.

@d33tah You may have a good point but I don’t see a way to use os.stat to tell directory from a file. It raises OSError when the path is invalid, no matter whether it’s file or directory. Also, any code after checking is also susceptible to race conditions.

15 Answers 15

>>> import os >>> os.path.isdir('new_folder') True 

Use os.path.exists for both files and directories:

>>> import os >>> os.path.exists(os.path.join(os.getcwd(), 'new_folder', 'file.txt')) False 
 >>> from pathlib import Path >>> Path('new_folder').is_dir() True >>> (Path.cwd() / 'new_folder' / 'file.txt').exists() False 

@syedrakib While parentheses can be used to indicate that an object is callable, that’s not useful in Python, since even classes are callable. Also, functions are first-class values in Python, and you can use them without the parentheses notation, like in existing = filter(os.path.isdir([‘/lib’, ‘/usr/lib’, ‘/usr/local/lib’])

You can pass functions to other functions, like map , but in the general case, you call functions with arguments and parentheses. Also, there is some typo in your example. presumably you mean filter(os.path.isdir, [‘/lib’, ‘/usr/lib’, ‘/usr/local/lib’]) .

Be aware that on some platforms these will return false if the file/directory exists, but a read permission error also occurs.

The examples above are not portable, and would be better if rewritten using os.path.join, or the pathlib stuff recommended below. Something like this: print(os.path.isdir(os.path.join(‘home’, ‘el’)))

Читайте также:  Что делает eval python

Python 3.4 introduced the pathlib module into the standard library, which provides an object oriented approach to handle filesystem paths. The is_dir() and exists() methods of a Path object can be used to answer the question:

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 

Paths (and strings) can be joined together with the / operator:

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 

Pathlib is also available on Python 2.7 via the pathlib2 module on PyPi.

So close! os.path.isdir returns True if you pass in the name of a directory that currently exists. If it doesn’t exist or it’s not a directory, then it returns False .

Or using pathlib: Path(path).mkdir(parents=True, exist_ok=True) creates a nested path in one operation.

@CamilStaps This question was viewed 354000 times (by now). Answers here are not only for OP, they are for anyone who could come here for whatever reason. aganders3’s answer is pertinent even if it does not directly resolve OP’s problem.

We can check with 2 built in functions

It will give boolean true the specified directory is available.

os.path.exists("directoryorfile") 

It will give boolead true if specified directory or file is available.

To check whether the path is directory;

will give boolean true if the path is directory

The following code checks the referred directory in your code exists or not, if it doesn’t exist in your workplace then, it creates one:

import os if not os.path.isdir("directory_name"): os.mkdir("directory_name") 

You may also want to create the directory if it’s not there.

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

For older versions of Python, I see two answers with good qualities, each with a small flaw, so I will give my take on it:

Try os.path.exists , and consider os.makedirs for the creation.

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

As noted in comments and elsewhere, there’s a race condition – if the directory is created between the os.path.exists and the os.makedirs calls, the os.makedirs will fail with an OSError . Unfortunately, blanket-catching OSError and continuing is not foolproof, as it will ignore a failure to create the directory due to other factors, such as insufficient permissions, full disk, etc.

One option would be to trap the OSError and examine the embedded error code (see Is there a cross-platform way of getting information from Python’s OSError):

import os, errno try: os.makedirs(directory) except OSError as e: if e.errno != errno.EEXIST: raise 

Alternatively, there could be a second os.path.exists , but suppose another created the directory after the first check, then removed it before the second one – we could still be fooled.

Depending on the application, the danger of concurrent operations may be more or less than the danger posed by other factors such as file permissions. The developer would have to know more about the particular application being developed and its expected environment before choosing an implementation.

Modern versions of Python improve this code quite a bit, both by exposing FileExistsError (in 3.3+).

try: os.makedirs("path/to/directory") except FileExistsError: # directory already exists pass 
os.makedirs("path/to/directory", exist_ok=True) # succeeds even if directory exists. 

Источник

Оцените статью