mlh3789
mlh3789

Reputation: 783

Determine if string input could be a valid directory in Python

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!

Upvotes: 23

Views: 60856

Answers (3)

howdoicode
howdoicode

Reputation: 961

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>
    ...

Upvotes: 2

Chris Barker
Chris Barker

Reputation: 2389

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))

Upvotes: 15

Sajjan Singh
Sajjan Singh

Reputation: 2553

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 .

Upvotes: 4

Related Questions