Python Forum

Full Version: chkFile with absolute paths
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hey everyone,

Here is a function I made to check if files exist.
def chkFile(filesPath):
	if hasattr(filesPath, "__len__"):
		for i in filesPath:
			if not path.exists(i):
				return False
		return True
	else:
		return path.exists(filesPath)
it works great for files in the main directories, and subdirectories. However I am trying to get it to recognize a file located in /sys/bus/w1/devices/, which is nowhere near my working dir. anyone know how I can change this to accept absolute dir's?

Thanks
What kind of object are you passing into the function?

os.path.exists() should have no problems with files outside your current directory.

>>> import os
>>> os.path.exists("/var/tmp")
True
>>> os.path.exists("/etc/fstab")
True
Quote:What kind of object are you passing into the function?

a string with the directory I mentioned above

could the os be blocking it? does linux make some Dir's off limits to Python?
I don't understand how that function would work even locally for files of more than 1 character.

If you pass in a string like "local", then it loops over each of the characters. It will check if the path "l" exists, and return False if it doesn't.

What's the purpose of checking if it has a __len__ attribute and then looping over the elements if it does?
You can also add in a list of paths, and it will return False if one is. It good, or True if they are all valid.

Compares the runs the __len__ attribute into the hasattr function to see if its a list or a string
But that's not a valid distinction. Both strings and lists have __len__.

>>> hasattr(list, "__len__")
True
>>> hasattr(str, "__len__")
True
So a list will work, but a string won't.

from os import path

def chkFile(filesPath):
    if hasattr(filesPath, "__len__"):
        for i in filesPath:
            if not path.exists(i):
                return False
        return True
    else:
        return path.exists(filesPath)

print(chkFile(['/etc/fstab', '/tmp']))
print(chkFile('/etc/fstab'))
Output:
True False
do you have a better suggestion?

I tried it when I made it and it worked, but I will check again to make sure it wasn't a fluke. Python is new to me, and the other languages I have used didn't differentiate between list, truples, and dictionaries.
Most functions just assume that particular type will be sent in (it's always a list-like object or it's always a string).

You can ask the object if it's an instance of a string and otherwise assume you could iterate through it.

def show_strings(obj):
    if isinstance(obj, str):
        print(f"got the single string {obj}")
    else:
        for s in obj:
            print(f"One string in the collection is {s}")


show_strings("onestring")
print()
show_strings(("string1", "string2", "string3"))
Output:
got the single string onestring One string in the collection is string1 One string in the collection is string2 One string in the collection is string3
I don't see any reason that it should work on local files and fail on files in /sys. Does it work for something like "/etc/passwd"? I don't have the file that you're concerned about on my system, so I don't know if it's special in some way.