The mkdir you are using is this one in pathlib (some of the comments were assuming os.mkdir)
Path.mkdir(mode=0o777, parents=False, exist_ok=False)
Create a new directory at this given path. If mode is given, it is combined with the process’ umask value to determine the file mode and access flags. If the path already exists, FileExistsError is raised.
If parents is true, any missing parents of this path are created as needed; they are created with the default permissions without taking mode into account (mimicking the POSIX mkdir -p command).
If parents is false (the default), a missing parent raises FileNotFoundError.
If exist_ok is false (the default), FileExistsError is raised if the target directory already exists.
If exist_ok is true, FileExistsError exceptions will be ignored (same behavior as the POSIX mkdir -p command), but only if the last path component is not an existing non-directory file.
Changed in version 3.5: The exist_ok parameter was added.
It should work fine without parameters if you provide a valid path.
Note if you want to check if it exists, you'll need to call the exists() method - don't forget the ()
However, it's not a great approach, because someone else could make the directory(or a file) at that path between when you check for it and when you get around to creating it. This is called a race condition.
It's better to wrap the mkdir in a try/except and let the OS tell you if there's a problem. There are a lot more possibilities for exceptions than just already existing. eg.
def directory(): p = Path(input("Enter file path: ")) try: p.mkdir() print('Directory does not exist. Making directory for you.') except IOError as ex: print('Couldn't create directory', ex)
p.existsisn't calling a function namedexists; it returns a reference to the function itself; since that reference is neitherNone,False,0, etc. (and doesn't have a__bool__method to say otherwise), it evaluates as true in a boolean context. (I'm guessing you're coming from the Ruby world, whereobject.funcnamecalls the function calledfuncname? That's not true here; it returns a handle on that function, and you need to call it, asobject.funcname(), to actually get it to be invoked).