14

Currently, I have the following code...

file_name = content.split('=')[1].replace('"', '') #file, gotten previously
fileName = "/" + self.feed + "/" + self.address + "/" + file_name #add folders 
output = open(file_name, 'wb')
output.write(url.read())
output.close()

My goal is to have python write the file (under file_name) to a file in the "address" folder in the "feed" folder in the current directory (IE, where the python script is saved)

I've looked into the os module, but I don't want to change my current directory and these directories do not already exist.

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
Philip Massey
  • 1,401
  • 3
  • 14
  • 24

3 Answers3

12

First, I'm not 100% confident I understand the question, so let me state my assumption: 1) You want to write to a file in a directory that doesn't exist yet. 2) The path is relative (to the current directory). 3) You don't want to change the current directory.

So, given that: Check out these two functions: os.makedirs and os.path.join. Since you want to specify a relative path (with respect to the current directory) you don't want to add the initial "/".

dir_path = os.path.join(self.feed, self.address)  # will return 'feed/address'
os.makedirs(dir_path)                             # create directory [current_path]/feed/address
output = open(os.path.join(dir_path, file_name), 'wb')
shabeer90
  • 5,161
  • 4
  • 47
  • 65
KP.
  • 1,247
  • 1
  • 9
  • 12
  • 3
    os.makdirs(dir_path, exist_ok=True) will then not raise OSError exception if dir exists. The default is to raise OSError if directory exists. – kaicarno Oct 19 '17 at 16:05
10

This will create the file feed/address/file.txt in the same directory as the current script:

import os

file_name = 'file.txt'
script_dir = os.path.dirname(os.path.abspath(__file__))
dest_dir = os.path.join(script_dir, 'feed', 'address')
try:
    os.makedirs(dest_dir)
except OSError:
    pass # already exists
path = os.path.join(dest_dir, file_name)
with open(path, 'wb') as stream:
    stream.write('foo\n')
ekhumoro
  • 115,249
  • 20
  • 229
  • 336
1

Commands like os.mkdir don't actually require that you make the folder in your current directory; you can put a relative or absolute path.

os.mkdir('../new_dir')
os.mkdir('/home/you/Desktop/stuff')

I don't know of a way to both recursively create the folders and open the file besides writing such a function yourself - here's approximately the code in-line. os.makedirs will get you most of the way there; using the same mysterious self object you haven't shown us:

dir = "/" + self.feed + "/" + self.address + "/"
os.makedirs(dir)
output = open(os.path.join(dir, file_name), 'wb')
Thomas
  • 6,515
  • 1
  • 31
  • 47