4

I need to write to a file (truncating) and the path it is on itself might not exist). For example, I want to write to /tmp/a/b/c/config, but /tmp/a itself might not exist. Then, open('/tmp/a/b/c/config', 'w') would not work, obviously, since it doesn't make the necessary directories. However, I can work with the following code:

import os config_value = 'Foo=Bar' # Temporary placeholder config_dir = '/tmp/a/b/c' # Temporary placeholder config_file_path = os.path.join(config_dir, 'config') if not os.path.exists(config_dir): os.makedirs(config_dir) with open(config_file_path, 'w') as f: f.write(config_value) 

Is there a more Pythonic way to do this? Both Python 2.x and Python 3.x would be nice to know (even though I use 2.x in my code, due to dependency reasons).

1 Answer 1

2

If you're repeating this pattern in multiple places, you could create your own Context Manager that extends open() and overloads __enter__():

import os class OpenCreateDirs(open): def __enter__(self, filename, *args, **kwargs): file_dir = os.path.dirname(filename) if not os.path.exists(file_dir): os.makedirs(file_dir) super(OpenCreateDirs, self).__enter__(filename, *args, **kwargs) 

Then your code becomes:

import os config_value = 'Foo=Bar' # Temporary placeholder config_file_path = os.path.join('/tmp/a/b/c', 'config') with OpenCreateDirs(config_file_path, 'w') as f: f.write(config_value) 

The first method to be called when you run with open(...) as f: is open.__enter__(). So by creating directories before calling super(...).__enter__(), you create the directories before attempting to open the file.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks a lot :) Well, this was a one-off thing (in the current scenario) and I felt it was a common pattern for a lot of people, which is why I asked in the first place. However, the fact that I could use a Context Manager helps me out a lot in the long run.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.