Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python - specifically handle file exists exception

I have come across examples in this forum where a specific error around files and directories is handled by testing the errno value in OSError (or IOError these days ?). For example, some discussion here - Python's "open()" throws different errors for "file not found" - how to handle both exceptions?. But, I think, that is not the right way. After all, a FileExistsError exists specifically to avoid having to worry about errno.

The following attempt didn't work as I get an error for the token FileExistsError.

try:     os.mkdir(folderPath) except FileExistsError:     print 'Directory not created.' 

How do you check for this and similar other errors specifically ?

like image 869
cogitoergosum Avatar asked Dec 26 '13 20:12

cogitoergosum


People also ask

How do you check if a file exists or not?

To check if a file exists, you pass the file path to the exists() function from the os. path standard library. If the file exists, the exists() function returns True . Otherwise, it returns False .


2 Answers

According to the code print ..., it seems like you're using Python 2.x. FileExistsError was added in Python 3.3; You can't use FileExistsError.

Use errno.EEXIST:

import os import errno  try:     os.mkdir(folderPath) except OSError as e:     if e.errno == errno.EEXIST:         print('Directory not created.')     else:         raise 
like image 115
falsetru Avatar answered Sep 20 '22 12:09

falsetru


Here's an example of dealing with a race condition when trying to atomically overwrite an existing symlink:

# os.symlink requires that the target does NOT exist. # Avoid race condition of file creation between mktemp and symlink: while True:     temp_pathname = tempfile.mktemp()     try:         os.symlink(target, temp_pathname)         break  # Success, exit loop     except FileExistsError:         time.sleep(0.001)  # Prevent high load in pathological conditions     except:         raise os.replace(temp_pathname, link_name) 
like image 43
Tom Hale Avatar answered Sep 23 '22 12:09

Tom Hale