How can I safely create a nested directory?

前端 未结 27 2646
旧时难觅i
旧时难觅i 2020-11-22 00:07

What is the most elegant way to check if the directory a file is going to be written to exists, and if not, create the directory using Python? Here is what I tried:

27条回答
  •  花落未央
    2020-11-22 00:49

    I found this Q/A and I was initially puzzled by some of the failures and errors I was getting. I am working in Python 3 (v.3.5 in an Anaconda virtual environment on an Arch Linux x86_64 system).

    Consider this directory structure:

    └── output/         ## dir
       ├── corpus       ## file
       ├── corpus2/     ## dir
       └── subdir/      ## dir
    

    Here are my experiments/notes, which clarifies things:

    # ----------------------------------------------------------------------------
    # [1] https://stackoverflow.com/questions/273192/how-can-i-create-a-directory-if-it-does-not-exist
    
    import pathlib
    
    """ Notes:
            1.  Include a trailing slash at the end of the directory path
                ("Method 1," below).
            2.  If a subdirectory in your intended path matches an existing file
                with same name, you will get the following error:
                "NotADirectoryError: [Errno 20] Not a directory:" ...
    """
    # Uncomment and try each of these "out_dir" paths, singly:
    
    # ----------------------------------------------------------------------------
    # METHOD 1:
    # Re-running does not overwrite existing directories and files; no errors.
    
    # out_dir = 'output/corpus3'                ## no error but no dir created (missing tailing /)
    # out_dir = 'output/corpus3/'               ## works
    # out_dir = 'output/corpus3/doc1'           ## no error but no dir created (missing tailing /)
    # out_dir = 'output/corpus3/doc1/'          ## works
    # out_dir = 'output/corpus3/doc1/doc.txt'   ## no error but no file created (os.makedirs creates dir, not files!  ;-)
    # out_dir = 'output/corpus2/tfidf/'         ## fails with "Errno 20" (existing file named "corpus2")
    # out_dir = 'output/corpus3/tfidf/'         ## works
    # out_dir = 'output/corpus3/a/b/c/d/'       ## works
    
    # [2] https://docs.python.org/3/library/os.html#os.makedirs
    
    # Uncomment these to run "Method 1":
    
    #directory = os.path.dirname(out_dir)
    #os.makedirs(directory, mode=0o777, exist_ok=True)
    
    # ----------------------------------------------------------------------------
    # METHOD 2:
    # Re-running does not overwrite existing directories and files; no errors.
    
    # out_dir = 'output/corpus3'                ## works
    # out_dir = 'output/corpus3/'               ## works
    # out_dir = 'output/corpus3/doc1'           ## works
    # out_dir = 'output/corpus3/doc1/'          ## works
    # out_dir = 'output/corpus3/doc1/doc.txt'   ## no error but creates a .../doc.txt./ dir
    # out_dir = 'output/corpus2/tfidf/'         ## fails with "Errno 20" (existing file named "corpus2")
    # out_dir = 'output/corpus3/tfidf/'         ## works
    # out_dir = 'output/corpus3/a/b/c/d/'       ## works
    
    # Uncomment these to run "Method 2":
    
    #import os, errno
    #try:
    #       os.makedirs(out_dir)
    #except OSError as e:
    #       if e.errno != errno.EEXIST:
    #               raise
    # ----------------------------------------------------------------------------
    

    Conclusion: in my opinion, "Method 2" is more robust.

    [1] How can I create a directory if it does not exist?

    [2] https://docs.python.org/3/library/os.html#os.makedirs

提交回复
热议问题