19

I am writing boilerplate that handles command line arguments that will later be passed to another function. This other function will handle all of the directory creation (if necessary). Therefore my bp only needs to check if an input string could be a valid directory, OR a valid file, OR (some other thing). i.e. it needs to differentiate between something like "c:/users/username/" and "c:/users/username/img.jpg"

def check_names(infile):
    #this will not work, because infile might not exist yet
    import os
    if os.path.isdir(infile):
        <do stuff>
    elif os.path.isfile(infile):
        <do stuff>
    ...

The standard library does not appear to offer any solutions, but the ideal would be:

def check_names(infile):
    if os.path.has_valid_dir_syntax(infile):
        <do stuff>
    elif os.path.has_valid_file_syntax(infile):
        <do stuff>
    ...

After thinking about the question while typing it up, I can't fathom a way to check (only based on syntax) whether a string contains a file or directory other than the file extension and trailing slash (both of which may not be there). May have just answered my own question, but if anyone has thoughts about my ramblings please post. Thank you!

mlh3789
  • 723
  • 2
  • 7
  • 17

3 Answers3

12

I don't know what OS you're using, but the problem with this is that, on Unix at least, you can have files with no extension. So ~/foo could be either a file or a directory.

I think the closest thing you could get is this:

def check_names(path):
    if not os.path.exists(os.path.dirname(path)):
        os.makedirs(os.path.dirname(path))
Chris Barker
  • 2,279
  • 14
  • 15
  • Thanks, your observation is basically the "answer" although the answer I was looking for does not exist for that very reason. Directories can take crazy names on Windows as well, for example I just created a directory called ".../boat.jpg". The real question is how should the user specify a directory - that is essentially up to me to determine. – mlh3789 Jul 10 '13 at 12:55
4

Unless I'm misunderstanding, os.path does have the tools you need.

def check_names(infile):
    if os.path.isdir(infile):
        <do stuff>
    elif os.path.exists(infile):
        <do stuff>
    ...

These functions take in the path as a string, which I believe is what you want. See os.path.isdir and os.path.exists.


Yes, I did misunderstand. Have a look at this post .

Community
  • 1
  • 1
Sajjan Singh
  • 2,523
  • 2
  • 27
  • 34
1

New since Python 3.4, you could also use pathlib module:

def check_names(infile):
    from pathlib import Path
    if Path(infile).exists():       # This determines if the string input is a valid path
        if Path(infile).is_dir():
            <do stuff>
        elif Path(infile).is_file():
            <do stuff>
    ...
howdoicode
  • 779
  • 8
  • 16
  • @CrazyVideoGamez Invalid directory name would be in the realm of a `try/catch` block then. For example `Path(r"C:\test?").exists()` would produce `OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'C:\\test?'`. Or you could use regular expressions to check for invalid directory names. – howdoicode May 21 '21 at 13:32