简体   繁体   中英

python os.makedirs doesn't create directory

For some silly reason, the below works on creating the non-existing directory stored in output_result_dir , but not the non_existing directory stored in output_log_dir . The latter results in a FileNotFound Error with description "[WinError 3] The system cannot find the path specified: 'runpackage1\\calculated\\logs'"

log_dir = os.path.join(output_dir, 'logs')
output_config_dir = os.path.join(output_dir, 'config')
output_result_dir = os.path.join(output_dir, 'results')
for directory in [output_result_dir, log_dir, output_config_dir]:
    if not os.path.exists(directory):
        os.makedirs(directory)

Am I missing something really stupid here? I also tried inserting an os.path.abspath around the path to get from relative to full paths, but that didn't help either.

Edit: changed directory from path as some people rightfully pointed out. I actually copied code from two separate functions into one self-contained block here, hence introducing the error. It's not the issue that caused my problem.

Not able to confirm your bug ( https://pyfiddle.io - 3.6):

import os 

for root,dirs,files in os.walk("./"):
    print (root,dirs)
print("")

output_dir = "./temp"
log_dir = os.path.join(output_dir, 'logs')
output_config_dir = os.path.join(output_dir, 'config')
output_result_dir = os.path.join(output_dir, 'results')
for directory in [output_result_dir, log_dir, output_config_dir]:
    os.makedirs(directory)

for root,dirs,files in os.walk("./"):
    print (root,dirs)

Output:

('./', [])        # before

('./', ['temp'])  # after
('./temp', ['results', 'logs', 'config'])
('./temp/results', [])
('./temp/logs', [])

Creating the mcve fixed your problem.


 log_dir = os.path.join(output_dir, 'logs') output_config_dir = os.path.join(output_dir, 'config') output_result_dir = os.path.join(output_dir, 'results') for directory in [output_result_dir, log_dir, output_config_dir]: # using directory if not os.path.exists(path): # using path os.makedirs(path) # using path 

You also do not need the guard if not os.path.exists(path): - it is not needed because if the directory already exists - using os.makedirs(path) won't change that provided you give exists_ok=True .

Fix:

log_dir = os.path.join(output_dir, 'logs')
output_config_dir = os.path.join(output_dir, 'config')
output_result_dir = os.path.join(output_dir, 'results')
for directory in [output_result_dir, log_dir, output_config_dir]:   # directory
    os.makedirs(directory, exists_ok=True)                          # directory

The given code has no errors, you fixed it.

output_dir = '.'
log_dir = os.path.join(output_dir, 'logs')
output_config_dir = os.path.join(output_dir, 'config')
output_result_dir = os.path.join(output_dir, 'results')
for directory in [output_result_dir, log_dir, output_config_dir]:
    if not os.path.exists(directory):
        os.makedirs(directory)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM