Python case insensitive file name?

I need to upload a file with a name, but the name I get is case insensitive. "A.txt" really could be "a.txt". How to do it in a quick way (do not generate all possible names and try each)?

+8
python string file case-insensitive
source share
4 answers

You can specify the directory in the file ( os.listdir ) and see if there are matches for your file name. Matching can be done by lower trimming both file names and comparing.

+6
source share

You cannot do this without taking a list of directories and taking both elements that you are looking for, and each of them is generally for comparison. The file system is case sensitive and that's all it needs.

Here is the function (well, two) that I wrote to do this completely, recursively matching the file name: http://portableapps.hg.sourceforge.net/hgweb/portableapps/development-toolkit/file/775197d56e86/utils.py # l78 .

 def path_insensitive(path): """ Get a case-insensitive path for use on a case sensitive system. >>> path_insensitive('/Home') '/home' >>> path_insensitive('/Home/chris') '/home/chris' >>> path_insensitive('/HoME/CHris/') '/home/chris/' >>> path_insensitive('/home/CHRIS') '/home/chris' >>> path_insensitive('/Home/CHRIS/.gtk-bookmarks') '/home/chris/.gtk-bookmarks' >>> path_insensitive('/home/chris/.GTK-bookmarks') '/home/chris/.gtk-bookmarks' >>> path_insensitive('/HOME/Chris/.GTK-bookmarks') '/home/chris/.gtk-bookmarks' >>> path_insensitive("/HOME/Chris/I HOPE this doesn't exist") "/HOME/Chris/I HOPE this doesn't exist" """ return _path_insensitive(path) or path def _path_insensitive(path): """ Recursive part of path_insensitive to do the work. """ if path == '' or os.path.exists(path): return path base = os.path.basename(path) # may be a directory or a file dirname = os.path.dirname(path) suffix = '' if not base: # dir ends with a slash? if len(dirname) < len(path): suffix = path[:len(path) - len(dirname)] base = os.path.basename(dirname) dirname = os.path.dirname(dirname) if not os.path.exists(dirname): dirname = _path_insensitive(dirname) if not dirname: return # at this point, the directory exists but not the file try: # we are expecting dirname to be a directory, but it could be a file files = os.listdir(dirname) except OSError: return baselow = base.lower() try: basefinal = next(fl for fl in files if fl.lower() == baselow) except StopIteration: return if basefinal: return os.path.join(dirname, basefinal) + suffix else: return 
+5
source share

Make a list of directories; and create a dictionary containing the mapping of upper case files to the names of their actual files. Then make your entry in uppercase and find it in the dictionary.

+1
source share

This is a simple recursive function for the search suggested by Eli above:

 def find_sensitive_path(dir, insensitive_path): insensitive_path = insensitive_path.strip(os.path.sep) parts = insensitive_path.split(os.path.sep) next_name = parts[0] for name in os.listdir(dir): if next_name.lower() == name.lower(): improved_path = os.path.join(dir, name) if len(parts) == 1: return improved_path else: return find_sensitive_path(improved_path, os.path.sep.join(parts[1:])) return None 
+1
source share

All Articles