Trying to use open(filename, 'w' ) gives IOError: [Errno 2] No such file or directory if directory doesn't exist

104.3k Views Asked by At

I am trying to create and write to a text file using Python. I have searched and cannot find a solution/reason for this error.

Here's the code that doesn't work:

afile = 'D:\\temp\\test.txt'
outFile = open(afile, 'w' )
outFile.write('Test.')
outFile.close()

# Error: 2
# Traceback (most recent call last):
#   File "<maya console>", line 1, in <module>
# IOError: [Errno 2] No such file or directory: 'D:\\temp\\test.txt' #

Most answers I found related to the slashes in the path, so...

I tried 'D:/temp/test.txt' and got an error.
I tried r'D:\temp\test.txt' and got an error.

When I try to create a file at the root of D:/ I have success.

'D:/test.txt' works.
'D:\\test.txt' works.
r'D:\test.txt' works.

It seems that I can't create the directory path I would like while trying to create the file. What is the correct method for creating files at a specific path with Python on Windows(7)? Am I misunderstanding what open() can do? Does it create directories if they don't exist or do I need to explicitly create the directory path before I use open() in 'write' mode to create a file?

4

There are 4 best solutions below

6
On BEST ANSWER

You are correct in surmising that the parent directory for the file must exist in order for open to succeed. The simple way to deal with this is to make a call to os.makedirs.

From the documentation:

os.makedirs(path[, mode])

Recursive directory creation function. Like mkdir(), but makes all intermediate-level directories needed to contain the leaf directory.

So your code might run something like this:

filename = ...
dirname = os.path.dirname(filename)
if not os.path.exists(dirname):
    os.makedirs(dirname)
with open(filename, 'w'):
    ...
0
On

If you try to create a file in a directory that doesn't exist, you will get that error.

You need to ensure the directory exists first. You can do that with os.makedirs() as per this answer.

0
On

I encountered the same kind of error while scraping a website, as I was trying to create a text file named from the scraped title, because the scraped data contained special characters like /?:"|<>. But my OS doesn't let me create a file name with those special characters.

If that's the case, you can use Regex to replace those characters with an empty string.

Here is the code:

import re
test_str = "a/b?c<d>e|f"
new_str = re.sub(r"[\*\/:?\"<>|]", "", test_str, re.MULTILINE)
# new_str == abcdef
0
On

Alternately, you could check if the file exists before opening it with:

os.path.exists (afile)

Which will either say True or False, depending on whether it exists.